﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-COM</title><link>http://www.cppblog.com/woaidongmao/category/15858.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Mon, 10 Jan 2011 05:01:54 GMT</lastBuildDate><pubDate>Mon, 10 Jan 2011 05:01:54 GMT</pubDate><ttl>60</ttl><item><title>vc中调用Com组件的方法详解</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138250.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138250.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自：网络，来源未知，如有知晓者请告知我。需求：1.创建myCom.dll,该COM只有一个组件,两个接口：&nbsp;&nbsp; IGetRes--方法Hello(),&nbsp;&nbsp; IGetResEx--方法HelloEx()2.在工程中导入组件或类型库  #import "组件所在目录myCom.dll" no_namespace 或 &nbsp;&nbsp; #import ...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/138250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:59 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多人开发的基础---组件化编程,仿COM篇</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138249.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138249.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138249.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138249.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引言： &nbsp;&nbsp;&nbsp; 在大型项目的开发中，随着开发进度的进行，我们经常碰到模块之间耦合度太高的问题：由于开发人员经常要在别的模块中调用自己实现的功能，经常随意在某个函数中随意添加调用代码，造成了被修改的那个函数体过长，逻辑混乱。另一个问题是随意包含头文件：开发人员在开发中经常为了要使用某些类的功能而包含引用类的头文件造成类之间的耦合度太高，被包含类的头文件一处轻微修改经常就...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2011/01/10/138249.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/138249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:50 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是COM组件(源于互联网)</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138247.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:44:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138247.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138247.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138247.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://blog.csdn.net/thankall/archive/2009/01/15/3785583.aspx &nbsp; COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序，它们可以给应用程序，操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的，面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。  &nbsp; 　COM是Com...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2011/01/10/138247.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/138247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:44 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何判断一个COM对象是否可用</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138246.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:39:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138246.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138246.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138246.html</trackback:ping><description><![CDATA[<form id="Form1" method="post" name="Form1" action="http://www.cppblog.com/27627.html" _initialAction="27627.html"> <div id="centercontent"> <div class="post"><span style="font-family: simsun" lang="zh-CN"><span style="font-style: italic; font-family: arial; text-decoration: underline">By SmartPtr(</span><a style="font-style: italic; font-family: arial; text-decoration: underline" title="http://www.cppblog.com/SmartPtr/" href="http://www.cppblog.com/SmartPtr/">http://www.cppblog.com/SmartPtr/)</a></span><span style="font-family: simsun" lang="zh-CN"><span style="font-style: italic; font-family: arial; text-decoration: underline"></span><a style="font-style: italic; font-family: arial; text-decoration: underline" title="http://www.cppblog.com/SmartPtr/" href="http://www.cppblog.com/SmartPtr/"></a><br><br></span><font size="4">&nbsp; 同事工作中遇到这个问题，不想在创建对象失败时才知道原来对应的COM对象不可用。自己项目中用到了这个，遂总结一下，希望对大家有用。<br>&nbsp; 要判断一个COM对象是否有用，首先要判断该COM对象的CLSID是否在注册表中注册，但注册了并不能保证其可用，因为如果我误删了该COM对象的载体-DLL(或exe)，该COM对象仍然不能正确创建。所以我们还要判断该载体文件是否存在，两者都通过了，该COM对象才可正确创建。<br>&nbsp;&nbsp; 直接看代码：<br></font> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">bool</span><span style="color: #000000"> IsCOMAvailable(CString strGUID)<br>{<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 1. Try to open the HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} key</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; CString strKeyName </span><span style="color: #000000">=</span><span style="color: #000000"> _T(</span><span style="color: #000000">"</span><span style="color: #000000">CLSID\\</span><span style="color: #000000">"</span><span style="color: #000000">) </span><span style="color: #000000">+</span><span style="color: #000000"> strGUID;<br>&nbsp;&nbsp;&nbsp; HKEY hClsidKey;<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">( ::RegOpenKeyEx( HKEY_CLASSES_ROOT, strKeyName, </span><span style="color: #000000">0</span><span style="color: #000000">, KEY_QUERY_VALUE, </span><span style="color: #000000">&amp;</span><span style="color: #000000">hClsidKey ) </span><span style="color: #000000">==</span><span style="color: #000000"> ERROR_SUCCESS )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 2. Continue to open CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InProcServer32\(Default)</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY hInProcServer32Key;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">( ::RegOpenKeyEx( hClsidKey, _T( </span><span style="color: #000000">"</span><span style="color: #000000">InProcServer32</span><span style="color: #000000">"</span><span style="color: #000000"> ), </span><span style="color: #000000">0</span><span style="color: #000000">, KEY_QUERY_VALUE, </span><span style="color: #000000">&amp;</span><span style="color: #000000">hInProcServer32Key ) </span><span style="color: #000000">==</span><span style="color: #000000"> ERROR_SUCCESS )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCHAR tszServerPathName[_MAX_PATH];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwSize </span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">( tszServerPathName );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwType;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 3. Get the com dll path</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">( ::RegQueryValueEx( hInProcServer32Key, NULL, NULL, </span><span style="color: #000000">&amp;</span><span style="color: #000000">dwType, (LPBYTE)tszServerPathName, </span><span style="color: #000000">&amp;</span><span style="color: #000000">dwSize ) </span><span style="color: #000000">==</span><span style="color: #000000"> ERROR_SUCCESS )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">( dwType </span><span style="color: #000000">!=</span><span style="color: #000000"> REG_SZ )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> 4. If the dll file exist</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFileFind fileFind;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000">(fileFind.FindFile(tszServerPathName))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::CloseHandle(hInProcServer32Key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::CloseHandle(hClsidKey);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br>}</span></div></div></div></form><img src ="http://www.cppblog.com/woaidongmao/aggbug/138246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:39 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM与DLL</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138245.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:37:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138245.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138245.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138245.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138245.html</trackback:ping><description><![CDATA[<pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">com</span><span style="line-height: 150%; color: black; font-size: 14pt">英文为<span lang="EN-US">Component Object Model</span>（组件对象模型），是微软生产软件组件的标准。<span lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">它是构造二进制兼容软件组件的规范，不管组件应用何种语言编写只要遵循<span lang="EN-US">com</span>规范就可以<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">相互直接通信。提出<span lang="EN-US">com</span>规范主要是为了满足： <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">1.</span><span style="line-height: 150%; color: black; font-size: 14pt">程序的快速开发，可以将一个大型的工程分成若干个<span lang="EN-US">com</span>组件同时开发。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">2.</span><span style="line-height: 150%; color: black; font-size: 14pt">可以动态的插入或卸载<span lang="EN-US">com</span>组件。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">3.</span><span style="line-height: 150%; color: black; font-size: 14pt">可以隐藏或封装<span lang="EN-US">com</span>组件内部的实现细节。<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体" lang="EN-US">com</span></strong><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">组件可以由不同的语言进行编写，但<span lang="EN-US">com</span>组件之间的通信是通过组件的接口来实现的，</span></strong><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体" lang="EN-US">com</span></strong><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">组件接口的实现是统一的，它采用的是虚拟函数表（<span lang="EN-US">VTBL</span>）形式。虚拟函数表中包含了</span></strong><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">组件函数的一组指针，我们可以通过这组指针来获取我们想要通信的组件函数的内存地址。</span></strong><span style="line-height: 150%; color: black; font-size: 14pt"> <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体" lang="EN-US">dll</span></strong><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">（动态链接库）是包含函数和数据的模块的集合。它可以导出数据也可以导出函数以供</span></strong><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">其它的<span lang="EN-US">dll</span>调用。<span lang="EN-US">dll</span>的加载可以通过静态链接和动态链接两种方式。</span></strong><span style="line-height: 150%; color: black; font-size: 14pt"> <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">1.</span><span style="line-height: 150%; color: black; font-size: 14pt">静态链接时将所要链接的<span lang="EN-US">dll</span>模块以二进制的形式编译进其他模块。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">2.</span><span style="line-height: 150%; color: black; font-size: 14pt">动态链接指调用模块在运行时加载<span lang="EN-US">DLL</span>，使用<span lang="EN-US">LoadLibrary</span>函数或<span lang="EN-US">LoadLibraryEx<o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">函数将<span lang="EN-US">dll </span>加载到进程的地址空间，并调用<span lang="EN-US">GetProcAddress</span>函数以获取导出的<span lang="EN-US"> DLL <o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">函数的地址。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">动态加载<span lang="EN-US">dll</span>的优点： <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">1.DLL</span><span style="line-height: 150%; color: black; font-size: 14pt">可节省内存并减少交换。通过在内存中共享<span lang="EN-US"> DLL </span>的单个副本，多个进程可以同时<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">使用一个<span lang="EN-US">DLL</span>。相比之下，对于使用静态链接库构建的每一个应用程序，<span lang="EN-US">Windows </span>都要<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">在内存中为其加载库代码的一个副本。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">2.DLL </span><span style="line-height: 150%; color: black; font-size: 14pt">可节省磁盘空间。 多个应用程序可以共享磁盘上的一个<span lang="EN-US"> DLL </span>副本。相比之下，<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">使用静态 链接库构建的每一个应用程序都需要让链接到程序文件映像的库代码作为一个<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">单独的专用副本。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体" lang="EN-US">dll</span></strong><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">与<span lang="EN-US">com</span>的关系：<span lang="EN-US">com</span>是一种规范，按照是<span lang="EN-US">com</span>规范实现的<span lang="EN-US">dll</span>可以被视为<span lang="EN-US">com</span>组件，</span></strong><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US"><o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">例如我们用<span lang="EN-US">mfc</span>建立的<span lang="EN-US">Active X</span>控件工程其中的接口封装是靠<span lang="EN-US">idl</span>描述的所以可以视为<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">com</span><span style="line-height: 150%; color: black; font-size: 14pt">组件。而且从上面关于<span lang="EN-US">com</span>和<span lang="EN-US">dll</span>的说明可以看出<span lang="EN-US">com</span>组件的接口是一组具有特定规范的<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">函数，所以<span lang="EN-US">com</span>组件可以别视为<span lang="EN-US">dll</span>但<span lang="EN-US">dll</span>不一定是<span lang="EN-US">com</span>组件。 <span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体" lang="EN-US">com</span></strong><strong><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: 宋体">和<span lang="EN-US">DLL</span>最大的区别就是<span lang="EN-US">: dll</span>是以函数集合的方式来调用的是编程语言相关的</span></strong><span style="line-height: 150%; color: black; font-size: 14pt">象<span lang="EN-US">VC</span>必须<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">加上<span lang="EN-US">extern "C"...</span>而<span lang="EN-US">COM</span>是以<span lang="EN-US">interface</span>的方式提供给用户使用的是一种二进制的调用<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">规范<span lang="EN-US">,</span>是与编程语言无关的<span lang="EN-US">,</span>它使用<span lang="EN-US">idl</span>接口定义语言来描述自己使用类继承来实现自己的功能<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">和方法<span lang="EN-US">.DLL</span>只有<span lang="EN-US">DLL</span>一种形势<span lang="EN-US">,</span>里面可任意定义函数无限制<span lang="EN-US">,</span>只能运行在本机上 而<span lang="EN-US">COM <o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">有<span lang="EN-US">DLL</span>和<span lang="EN-US">EXE</span>两种存在形势<span lang="EN-US">: COM</span>所在的<span lang="EN-US">DLL</span>中必须导出四个函数<span lang="EN-US">: <o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">dllgetobjectclass, dllregisterserver, dllunregisterserver, <o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">dllunloadnow <o:p></o:p></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">这四个函数各有作用<span lang="EN-US">,</span>有些是提供给<span lang="EN-US">COM</span>管理器用的<span lang="EN-US">,</span>通过<span lang="EN-US">CLSID</span>和<span lang="EN-US">IID</span>来使用<span lang="EN-US">,</span>有些是提供<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">给注册机用的<span lang="EN-US">. <o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">COM</span><span style="line-height: 150%; color: black; font-size: 14pt">结合<span lang="EN-US">MTS,</span>就是<span lang="EN-US">COM+, </span>是<span lang="EN-US">DCOM</span>的高级版本<span lang="EN-US">,</span>提供了更为强大和安全的分布式<span lang="EN-US">COM</span>服务<span lang="EN-US">, <o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt" lang="EN-US">DCOM</span><span style="line-height: 150%; color: black; font-size: 14pt">运行在不同的机器上 用<span lang="EN-US">proxy</span>和<span lang="EN-US">stub</span>来实现远程接口的本地映射 二者从执行速度来<span lang="EN-US"><o:p></o:p></span></span></pre><pre style="text-justify: inter-ideograph; text-align: justify; line-height: 150%; background: white"><span style="line-height: 150%; color: black; font-size: 14pt">说 二者相差无几 但是启动速度<span lang="EN-US">DLL</span>要比<span lang="EN-US">COM</span>快！<span lang="EN-US"><o:p></o:p></span></span></pre>
<p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 14pt; mso-bidi-font-family: arial" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="line-height: 150%" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: arial" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/138245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:37 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM笔记-包容与聚合</title><link>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138244.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 10 Jan 2011 04:34:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138244.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/138244.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2011/01/10/138244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/138244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/138244.html</trackback:ping><description><![CDATA[<p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">COM</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">不支持实现继承的原因在于这种继承方式将使得一个对象的实现同另外一个对象的实现紧紧地关联起来。</span><span style="font-family: 宋体; color: fuchsia; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">在这种情况下，当基类的实现被修改后，派生类将无法正常运行而必须被修改</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">。这就是为什么一些用</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">C++</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">编写大型程序的专家们强烈建议人们基于抽象类来构建应用程序。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><?xml:namespace prefix = o /><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">因此，为了保证以组件的修改不会影响应用程序的正常运行，</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">COM</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">并不支持实现继承。我们可以用组件</span><span style="font-family: 宋体; color: fuchsia; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">来完全</span><span style="font-family: 宋体; color: fuchsia; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">模拟实现继承</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;<o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><span style="color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容和聚合</span><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">　</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">对一个组件加以扩展或改造以使符合自己的使用需要，并可能会希望用此改造后的组件来代替原有的组件。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">在</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">C++</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">中，对类的改造是用包容和继承来实现的。在</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">COM</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">中，则可使用包容和聚合来对组件进行改造。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp; </span><span style="font-family: 宋体; color: fuchsia; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;</span><span style="font-family: 宋体; color: fuchsia; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容和聚合实际上是使用一个组件使用别外一个组件的一种技术。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">在包容的情况下，外部组件将包含</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">内部组件</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">，而在聚合的情况下，则称外部组件聚合</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">内部组件</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;<o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="font-family: 宋体; color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容的简介</span></strong><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容是在接口级别完成的。外部组件包含指向内部组件接口的指针。此时外部组件只是内部组件的一个客户，它将使用内部组件的接口来实现它自己的接口，见图</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">8-1</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/COM_B082/clip_image002_2.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/COM_B082/clip_image002_thumb.gif" width="580" height="304" v:shapes="_x0000_i1025"></a><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">外部组件也可以通过将调用转发给内部组件的方法重新实现内部组件所支持的某个接口。并且外部组件还可以在内部组件代码的前后加一些代码以对接口进行改造，见图</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">8-2</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/COM_B082/clip_image004_2.gif"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/COM_B082/clip_image004_thumb.gif" width="580" height="313" v:shapes="_x0000_i1026"></a><o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="font-family: 宋体; color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容的实现</span></strong><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">在下面给出的例子中，组件</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">1</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">是一个实现了两个接口</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IX</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">和</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">的外部组件，但它复用了组件</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">2</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">（组件</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">1</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">所包容的一个内部组件，对</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">的实现，这一点同图</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">8-2</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">所示完全是相同的）</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="font-family: 宋体; color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">包容例子</span></strong><span style="color: #333333; font-size: 12pt; font-weight: normal; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><a href="http://www.box.net/shared/lp661oxigu" target="_blank"><span style="border-bottom: gray 1pt solid; border-left: gray 1pt solid; padding-bottom: 2pt; padding-left: 2pt; padding-right: 2pt; background: white; color: black; border-top: gray 1pt solid; border-right: gray 1pt solid; text-decoration: none; padding-top: 2pt; mso-border-alt: solid gray .75pt; text-underline: none"> </span><span style="border-bottom: gray 1pt solid; border-left: gray 1pt solid; padding-bottom: 2pt; padding-left: 2pt; padding-right: 2pt; background: white; color: black; border-top: gray 1pt solid; border-right: gray 1pt solid; text-decoration: none; padding-top: 2pt; mso-bidi-font-family: 宋体; mso-fareast-language: zh-cn; mso-border-alt: solid gray .75pt; text-underline: none"><o:p></o:p></span></a></span></h3> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="border-bottom: gray 1pt solid; border-left: gray 1pt solid; padding-bottom: 2pt; padding-left: 2pt; padding-right: 2pt; font-family: 宋体; background: white; color: red; font-size: 12pt; border-top: gray 1pt solid; border-right: gray 1pt solid; padding-top: 2pt; mso-bidi-font-family: arial; mso-fareast-language: zh; mso-border-alt: solid gray .75pt" lang="EN-US"><a href="http://www.box.net/shared/lp661oxigu" target="_blank"><span style="color: red; text-decoration: none; text-underline: none">(</span><span style="color: red; text-decoration: none; text-underline: none" lang="ZH">环境</span><span style="color: red; text-decoration: none; text-underline: none">vs2008)</span><span style="border-bottom: medium none; border-left: medium none; color: windowtext; border-top: medium none; border-right: medium none; text-decoration: none; mso-bidi-font-family: 宋体; mso-fareast-language: zh-cn; text-underline: none"><o:p></o:p></span></a></span></strong></h3> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p>&nbsp;</o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><a href="http://www.box.net/shared/lp661oxigu" target="_blank"><span style="border-bottom: gray 1pt solid; border-left: gray 1pt solid; padding-bottom: 2pt; padding-left: 2pt; padding-right: 2pt; background: white; color: navy; border-top: gray 1pt solid; border-right: gray 1pt solid; text-decoration: none; padding-top: 2pt; mso-border-alt: solid gray .75pt; text-underline: none" lang="ZH">代码下载</span></a></span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">：</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">http://www.box.net/shared/lp661oxigu<o:p></o:p></span></p> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;<o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="font-family: 宋体; color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">聚合简介</span></strong><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US">&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">聚合是包容的一个特例。外部组件将直接把内部组件的接口指针返回给客户。使用此种方法，外部组件将无需重新实现并转发接口中的所有函数。见图</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">8-3</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">。但这样外部组件无法对接口中的函数进行任何改造。当外部组件将内部组件的接口指针返回给客户之后，客户就可以直接同内部组件打交道了。（但是客户不应该知道它是在同两个不同的组件交互，否则将无法满足封装的要求。）</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <h3 style="text-justify: inter-ideograph; text-align: justify; line-height: 13.5pt"><strong><span style="font-family: 宋体; color: red; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">聚合的实现</span></strong><span style="color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></h3> <p style="margin: 3.75pt 0cm" class="MsoNormal"><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">假定客户向外部组件请求接口</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">。此时外部组件可以不实现</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">接口，而只需将内部组件请求查询此</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">接口。指针返回给客户。客户可以直接使用此指针来调用内部组件所实现的那些</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">成员。此时就</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">接口而言，外部组件相当于是被架空了；它放弃了对</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-fareast-language: zh" lang="EN-US">IY</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="ZH">接口的控制，而将此控制交给了内部组件。</span><span style="font-family: 宋体; color: #333333; font-size: 12pt; mso-bidi-font-family: arial; mso-fareast-language: zh" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-bidi-font-family: arial" lang="EN-US"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/138244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2011-01-10 12:34 <a href="http://www.cppblog.com/woaidongmao/archive/2011/01/10/138244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM原理及应用----分布式COM（DCOM）</title><link>http://www.cppblog.com/woaidongmao/archive/2009/06/29/88751.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 29 Jun 2009 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/06/29/88751.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/88751.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/06/29/88751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/88751.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/88751.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>1</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">的进程透明特性表现在组件对象和客户程序即可以拥有各自的进程空间，也可以共享同一个进程空间，<span lang=EN-US>COM</span>负责把客户的调用正确传到组件对象中，并保证参数传递的正确性。组件对象和客户代码不必考虑调用传递的细节，只要按照一般的函数调用的方式实现即可。如果进一步拓展进程透明特性，考虑组件对象与客户程序运行在不同计算机上的情形，把进程透明性拓展为位置透明性，形成分布式组件对象模型，简称为<span lang=EN-US>DCOM</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">是<span lang=EN-US>COM</span>的扩展，它可以支持不同计算机上组件对象与客户程序之间或者组件对象之间的相互通信，这些计算机可以在局域网内、广域网上、<span lang=EN-US> Internet</span>上。对于客户程序而言，组件程序所处的位置是透明的，我们不必编写任何处理远程调用的代码，因此，<span lang=EN-US>DCOM</span>也是<span lang=EN-US>COM</span>的无缝扩展。<span lang=EN-US> DCOM</span>处理了底层网络协议的所有细节。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>2</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、从<span lang=EN-US>COM</span>转向<span lang=EN-US>DCOM<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">进程内组件与客户程序之间的通信过程比较简单。本地进程外组件与客户程序之间的通信并不是直接进行的，而是用到了操作系统支持的一些跨进程通信方法。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">只是简单地把本地跨进程通信用一个网络协议传输过程来代替，只是中间数据传递的路线更长一些。当然，网络通信比单机系统环境下的跨进程通信要脆弱得多，所以为了保证协作过程的可靠性以及程序对异常事件的应变能力，客户程序和组件程序需要考虑更多的细节。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>3</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM</span>对象的定位<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">客户程序调用<span lang=EN-US>COM</span>库的基础创建函数（比如<span lang=EN-US>CoGetClassObject</span>）创建远程组件对象需要知道远程机器名和对象<span lang=EN-US>CLSID</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">有两种方法可以得到远程对象的机器名信息：一是在创建函数的参数中指定<span lang=EN-US>COSERVERINFO</span>结构，二是使用<span lang=EN-US>DCOM</span>配置工具指定远程机器名。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">库的创建函数得到了远程对象的位置信息后，再把对象创建的任务交给<span lang=EN-US>SCM</span>，由<span lang=EN-US>SCM</span>通过<span lang=EN-US>RPC</span>与远程机器进行通信。<span lang=EN-US>SCM</span>（程序名为<span lang=EN-US> Rpcss.exe</span>）也是<span lang=EN-US>COM</span>库的一部分，但它是一个单独的进程。<span lang=EN-US>SCM</span>负责创建新的<span lang=EN-US>COM</span>对象，也负责建立组件对象与客户程序之间的连接。如果要创建远程对象，它会通过<span lang=EN-US>RPC</span>调用远程机器上的<span lang=EN-US>SCM</span>，由远程机器上的<span lang=EN-US>SCM</span>启动组件进程，并创建组件对象，然后返回到客户机器。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">当然，远程组件对象被创建之后，它在返回到客户机器的途中，还要经过列集和散集的处理，包括创建代理对象和装载存根代码等，这些处理与本地进程外组件对象的处理完全一致。一旦组件对象被创建完成之后，客户与组件之间的通信不再经过<span lang=EN-US>SCM</span>，而是直接通过代理对象和存根对象以及<span lang=EN-US>COM</span>库提供的底层传输机制来完成。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>4</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、列集与散集<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">列集与散集是实现<span lang=EN-US>COM</span>组件对象跨进程特性的关键技术，它包括标准列集法和自定义列集法。同样的技术也适用于<span lang=EN-US>DCOM</span>组件对象与客户程序之间的通信，两者的区别在于列集数据包的传递方式有所不同，对于本地组件对象使用<span lang=EN-US>LPC</span>传递，而对于<span lang=EN-US>DCOM</span>组件对象使用<span lang=EN-US>RPC</span>传递。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">提供了一套复杂的列集和散集机制，它建立在<span lang=EN-US>RPC</span>的基础上。由于<span lang=EN-US>RPC</span>被定义为<span lang=EN-US>DCE</span>（分布式计算系统）标准的一部分，而<span lang=EN-US>DCE RPC</span>定义了所有常用数据类型的数据表达方式，即网络数据表示法（<span lang=EN-US>NDR</span>，<span lang=EN-US>network data representation</span>）。为了使存根代码和代理对象能够正确地对参数和返回结果进行列集和散集，它们应该使用一致的数据表示法<span lang=EN-US>NDR</span>，以便在不同的操作系统环境下也能够远程调用。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>5</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、对象<span lang=EN-US>RPC<o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">协议也被称为对象<span lang=EN-US>RPC</span>（<span lang=EN-US>ORPC</span>，<span lang=EN-US>object remote procedure call</span>），它建立在<span lang=EN-US>DCE RPC</span>协议的基础上，可用于各种基于组件的分布式系统。<span lang=EN-US>ORPC</span>建立了一套面向对象的远程调用规范，指定了如何在网络上进行调用、对对象的引用如何表示和如何维护。<span lang=EN-US>ORPC</span>协议已经被作为<span lang=EN-US>Internet</span>草案递交到<span lang=EN-US>IETF</span>（<span lang=EN-US>Internet Engineering Task Force </span>，<span lang=EN-US> Internet </span>工程部）。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在<span lang=EN-US>Internet</span>或<span lang=EN-US>Intranet</span>网络环境下，<span lang=EN-US>ORPC</span>仍使用标准的<span lang=EN-US>RPC</span>数据包，附加上专用于<span lang=EN-US>DCOM</span>的一些信息――接口指针标识符（<span lang=EN-US>IPID</span>，<span lang=EN-US>interface point identifier</span>）、版本信息和扩展信息――作为调用和返回的附加参数进行传送，其中<span lang=EN-US>IPID</span>表示调用被处理的远程机器上特定对象的特定接口。<span lang=EN-US> DCOM</span>客户程序必须周期性地&#8220;<span lang=EN-US>pinging</span>&#8221;远程机器上的对象，以便保证客户与对象一直处于连接状态。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>6</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM</span>特性<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">可以作为分布式应用系统的基本架构，客户程序与<span lang=EN-US>DCOM</span>组件对象之间形成了客户／服务器关系，进一步可构成多层软件模型。<span lang=EN-US>DCOM</span>组件具有<span lang=EN-US>COM </span>组件的一些基本特性，包括重用性、语言无关性等。而位置透明性 是<span lang=EN-US>DCOM</span>的一个基本特性。<span lang=EN-US>DCOM</span>的其他特性如下：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>1</span>）可伸缩性。一方面，<span lang=EN-US>DCOM</span>利用操作系统本身的可伸缩性；另一方面，<span lang=EN-US>DCOM</span>提供了灵活的配置方案，允许不同的组件对象允许在不同的服务器上，<span lang=EN-US>DCOM</span>的位置透明性保证了这种变化可以不必修改组件源程序。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>2</span>）可配置性。安装和管理是分布式软件系统的两个重要环节。<span lang=EN-US>DCOM</span>提供了一个图形界面的配置工具程序（<span lang=EN-US>DCOMCNFG.EXE</span>），可使客户程序和组件程序在不改变代码的情况下适应不同的网络环境。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>3</span>）安全性。<span lang=EN-US>DCOM</span>使用了<span lang=EN-US>Windows NT</span>提供的可扩展安全性框架，在非<span lang=EN-US>NT</span>平台上实现的<span lang=EN-US>DCOM</span>也包括了一个与<span lang=EN-US>NT</span>兼容的安全提供器。<span lang=EN-US>DCOM</span>实现的安全性分为访问安全性和激活安全性，访问安全性指定那些用户可以调用组件对象，激发安全性指定哪些用户可以在一个新进程中创建新的对象。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>4</span>）协议无关性。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>5</span>）平台独立性<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>7</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、对象激活<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">激活（<span lang=EN-US>activation</span>）一个组件对象包括两种情形：一是创建新的组件对象，二是建立已有组件对象与客户之间的连接。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">扩展到<span lang=EN-US>DCOM</span>之后，远程对象的创建过程有所不同。为了标识一个远程对象，仅仅提供一个<span lang=EN-US>128</span>位的<span lang=EN-US>GUID</span>还不够，还必须提供远程对象所在的机器名，也称为远程服务器名&#8220;<span lang=EN-US>RemoteServerName</span>&#8221;。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>1</span>）创建<span lang=EN-US>DCOM</span>组件方法一<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">通过<span lang=EN-US>DCOM</span>配置工具指定远程服务器名，这种方式使得<span lang=EN-US>DCOM</span>组件具有位置透明性。在<span lang=EN-US>Windows</span>系统平台上，远程服务器名字<span lang=EN-US>RemoteServerName</span>值被保存在系统注册表<span lang=EN-US>HKEY_CLASSES_ROOT\APPID</span>键下。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">从<span lang=EN-US>CLSID</span>和<span lang=EN-US>AppID</span>键的结构可以看出，每个<span lang=EN-US>AppID</span>可用于多个组件对象，通常它代表了由多个<span lang=EN-US>CLSID</span>共享的进程，该进程中的所有对象共享同样的配置信息，包括远程服务器名以及安全信息。在<span lang=EN-US>DCOM</span>中引入<span lang=EN-US>AppID</span>概念可以避免太多的注册表关键字。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>2</span>）创建<span lang=EN-US>DCOM</span>组件方法二<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">用第一种方法并不是总能满足应用的要求，有些应用要求在程序运行过程中控制要连接的服务器，比如多人游戏程序、网络远程管理工具等。对于这样的应用，<span lang=EN-US>DCOM</span>允许在创建函数中指定远程服务器名字。可以指定远程服务器名字的创建函数：<span lang=EN-US>CoCreateInstanceEx</span>、<span lang=EN-US> CoGetClassObject</span>、<span lang=EN-US>CoGetInstanceFromFile</span>、<span lang=EN-US>CoGetInstanceFromeIStorage</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在程序中指定服务器名字的另外一个功能是实现分布式应用系统的动态负载平衡。目前<span lang=EN-US>DCOM</span>还很难以实现自动负载平衡特性，但我们可以建立一个分派服务组件对象，所有的客户都创建指定机器上的分派服务组件对象，由它创建另一个真正实现应用功能的远程对象，在把此远程对象返回给客户程序，以后客户程序不再使用分派服务组件对象，而直接调用远程对象。而分派服务组件对象可以根据当前的负载状态，从一组服务器中选择负载最轻的服务器作为目标，创建远程对象。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>8</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、远程创建进程内组件：代理进程（<span lang=EN-US>surrogate</span>）<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">为了远程运行进程内组件即<span lang=EN-US>DLL</span>组件，要求在远程机器上有代理进程（<span lang=EN-US>surrogate process</span>）。除了可以远程启动进程内组件之外，代理进程还提供了下面的特性：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">进程内组件程序中的严重错误只影响代理进程，不会使客户进程崩溃；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">一个代理进程可以同时为多个客户提供服务；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">客户可以保护自己避免靠不住的组件程序代码，只访问组件程序提供的服务；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在代理进程中运行进程内服务可使<span lang=EN-US>DLL</span>享有代理进程的安全性。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>Windows</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">引进了缺省的代理进程，以及编写自定义代理进程的协议规范。缺省实现的代理进程是一个混合线程模型、伪<span lang=EN-US>COM</span>服务程序。当多个<span lang=EN-US>DLL</span>组件被装入到单个代理进程时，该进程按照注册表中指定的线程模型对每个<span lang=EN-US>DLL</span>组件对象进行实例化。如果一个<span lang=EN-US>DLL</span>组件对象支持两种线程模型，则<span lang=EN-US>COM</span>选择自由线程模型。<span lang=EN-US>COM</span>即可以控制<span lang=EN-US>DLL</span>组件程序的卸载，也可以终止代理进程。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">如果一个进程内组件满足下列条件，则它将被装入代理进程：<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">系统注册表中，在组件对象的<span lang=EN-US>CLSID</span>关键字下必须要指定<span lang=EN-US>AppID</span>值，以及对应的<span lang=EN-US>AppID</span>关键字；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">客户程序在创建对象实例时，必须设置<span lang=EN-US>CLSTX_LOCAL_SERVER</span>标志；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">组件对象的<span lang=EN-US>CLSID</span>关键字下不指定<span lang=EN-US>LocalServer32</span>、<span lang=EN-US>LocalServer</span>、<span lang=EN-US>LocalService</span>值；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">组件对象的<span lang=EN-US>CLSID</span>关键字包含<span lang=EN-US>InProvServer32</span>子键；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在<span lang=EN-US>InProcServer32</span>子键中指定的<span lang=EN-US>DLL</span>文件必须存在；<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>l<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">组件对象对应的<span lang=EN-US>AppID</span>键下指定<span lang=EN-US>DllSurrogate</span>值。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">如果组件对象的<span lang=EN-US>CLSID</span>键下的<span lang=EN-US>LocalServer</span>、<span lang=EN-US>LocalServer32</span>或<span lang=EN-US>LocalService</span>值指示了<span lang=EN-US>EXE</span>的存在，则<span lang=EN-US>EXE</span>程序将被优先执行，<span lang=EN-US>COM</span>不再启动代理程序。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>9</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、利用名字对象（<span lang=EN-US>moniker</span>）连接到远程对象实例<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">通常<span lang=EN-US>COM</span>对象实例是不可相互替代到，或者说不可相互交换的。它通过自己特有的状态区别于同一类的其他对象实例。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在第<span lang=EN-US>8</span>章中介绍的<span lang=EN-US>COM</span>命名和绑定机制对于远程对象同样适用。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>10</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、连接管理——远程对象生存期的控制<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">控制对象的生存期最基本的机制是引用计数，利用<span lang=EN-US>IUnknown</span>的<span lang=EN-US>AddRef</span>和<span lang=EN-US>Release</span>成员函数控制对象的生存期。<span lang=EN-US>DCOM</span>优化了远程对象的<span lang=EN-US>AddRef</span>和<span lang=EN-US>Release</span>的调用。优化过程使用了<span lang=EN-US>OXID</span>（<span lang=EN-US>object exporter identifier </span>，对象管理标识符）对象。<span lang=EN-US>OXID</span>是一个<span lang=EN-US>64</span>位值，通过<span lang=EN-US>OXID</span>可以把<span lang=EN-US>RPC</span>串绑定调用到它们的目标<span lang=EN-US>IPID</span>。但是，在执行调用之前，调用进程必须把<span lang=EN-US> OXID</span>转译成为底层<span lang=EN-US>RPC</span>可以解释的一组绑定。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">在每台支持<span lang=EN-US>DCOM</span>的机器上，都有一个被称为<span lang=EN-US>OXID</span>解析器（<span lang=EN-US>OXID Resolver</span>）的服务，它负责向客户提供用于连接到<span lang=EN-US>OXID</span>的<span lang=EN-US>RPC</span>串绑定信息，也负责接收远程发来的&#8220;<span lang=EN-US>pinging</span>&#8221;信息。<span lang=EN-US>OXID</span>解析器之间通过<span lang=EN-US>RPC</span>进行通信，它实现了<span lang=EN-US>RPC</span>接口<span lang=EN-US>IOXIDResolver</span>（不是<span lang=EN-US>COM</span>接口）。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>11</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、连接管理——<span lang=EN-US>pinging</span>机制<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">如果不考虑客户进程可能会非正常终止，则利用远程引用计数控制对象生存期已经足够了。为了检测客户程序是否非正常终止，<span lang=EN-US>DCOM</span>提供了一种简单的方法 &#8220;<span lang=EN-US>pinging</span>&#8221;。在现在实现的<span lang=EN-US>DCOM</span>版本中，<span lang=EN-US>pingPeriod=2</span>（分）且<span lang=EN-US>numPingsToTimeOut=3</span>，这些值不能被改变。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>12</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、连接管理——连接点管理<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">许多实际的分布式应用都需要在两个对象之间进行双向通信。由于<span lang=EN-US>DCOM</span>是对<span lang=EN-US>COM</span>的无缝扩展，在第<span lang=EN-US>6</span>章中介绍的<span lang=EN-US>COM</span>提供的连接点机制同样适用于远程对象的情形。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>13</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、连接管理——连接传递<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">用分派服务组件对象来实现分布式应用的负载平衡特性实际上用到了连接传递特性。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">连接传递不等于远程对象创建的传递，<span lang=EN-US>DCOM</span>不支持位置透明方式下对象创建的传递过程，但可以利用连接传递特性，通过程序控制服务器名字的方式实现远程对象创建的传递。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>14</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、并发管理——线程模型<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">本身并没有线程模型，可以认为<span lang=EN-US>COM</span>借用了<span lang=EN-US>Windows</span>操作系统提供的线程模型，<span lang=EN-US>Win32</span>程序设计模型把线程分成<span lang=EN-US>UI</span>线程和辅助线程，相对应地，<span lang=EN-US>COM</span>把线程分成套间线程和自由线程。套间线程使用<span lang=EN-US>CoInitialize API</span>函数执行<span lang=EN-US>COM</span>库的初始化，<span lang=EN-US>COM</span>在套间线程内部创建了一个隐藏的窗口，此窗口的窗口过程函数负责把客户对套间中的组件对象的调用发送到正确的成员函数中。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>15</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、并发管理——消息过滤器<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">和<span lang=EN-US>DCOM</span>的线程模型使我们了解到了客户程序与组件对象调用过程中的线程切换，但调用可能会阻塞程序，甚至使得客户程序无法正常进行。为此，<span lang=EN-US>COM</span>提供了消息过滤机制，它既可用于客户程序，也可用于组件程序，允许它们对于入调用和出调用有所选择。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>COM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">把调用分为三类：第一种是同步调用，这是最常见的调用类型，客户调用组件对象，一直等到对象执行完所有功能后再返回；第二种是异步调用，客户调用组件对象，但不等到对象执行完功能就马上返回，以后对象通过出接口通知客户程序，这也就是我们在第<span lang=EN-US>6</span>章介绍的可连接对象机制；第三种为输入同步调用，被调用对象必须在放弃控制之前返回，以便保证用户界面不受影响，也就是说，在调用执行过程中，对象不能调用任何可能会进入消息循环的函数。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>16</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM</span>安全模型<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">安全性建立在底层安全提供器基础上，有些操作系统可以支持多个安全提供器，<span lang=EN-US>DCOM</span>和<span lang=EN-US>RPC</span>也可以同时支持多个安全提供器。所有的安全提供器有一个共同点，它们提供了一种表示安全角色（一般为用户账号）的方法、一种鉴定安全角色（一般通过口令或私有钥匙）的方法，以及管理安全角色和其鉴定数据的一套机制。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>17</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM</span>安全模型——安全性策略<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>1</span>）访问安全性和激发安全性。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>2</span>）对象的安全身份。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>3</span>）保护数据。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>4</span>）鉴定级别。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">（<span lang=EN-US>5</span>）模仿级别。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US>18</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">、<span lang=EN-US>DCOM</span>安全模型——安全性配置<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DCOM</span><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial">提供了多种保护应用程序的方法，一方面，<span lang=EN-US>DCOM</span>可以强制使用安全性而不用任何对象或对象的客户程序做任何工作，对象的安全性设置可以在外部配置并且<span lang=EN-US>DCOM</span>会自动强制使用。另一方面，<span lang=EN-US>DCOM</span>把它完整的安全性结构暴露给开发者，因而客户和对象都可以通过程序控制其安全策略。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="LINE-HEIGHT: 150%" class=MsoNormal><span style="LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; COLOR: black; FONT-SIZE: 12pt; mso-bidi-font-family: arial" lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/88751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-06-29 10:56 <a href="http://www.cppblog.com/woaidongmao/archive/2009/06/29/88751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>