﻿<?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++博客-时间的痕迹-文章分类-COM</title><link>http://www.cppblog.com/ivenher/category/198.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 21:51:22 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 21:51:22 GMT</pubDate><ttl>60</ttl><item><title>com 笔记十  类厂实现</title><link>http://www.cppblog.com/ivenher/articles/16463.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Dec 2006 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/16463.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/16463.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/16463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/16463.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/16463.html</trackback:ping><description><![CDATA[1、CoGetClassObject使用DllGetClassObject来创建类厂。声明如下：<br /><br />STDAPI    DllGetClassObject (<br />                                const   CLSID &amp;clsid,<br />                                const   IID &amp;  iid,<br />                                void  **  ppv  );<br />                                 <br />2、组件的创建过程<br /><br />客户调用 CoGetClassObject----〉com库调用DllGetClassObject ------&gt;返回给客户IClassFactory------&gt;客户调用 IClassFactory::CreateInstance------&gt;返回给客户 IX---------〉客户调用IX::FX.<br /><br /><img src ="http://www.cppblog.com/ivenher/aggbug/16463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-12-14 22:42 <a href="http://www.cppblog.com/ivenher/articles/16463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com笔记九 为什么用类厂</title><link>http://www.cppblog.com/ivenher/articles/16460.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Dec 2006 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/16460.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/16460.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/16460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/16460.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/16460.html</trackback:ping><description><![CDATA[
		<p>
				<br />1.CoCreateInstance的不灵活.<br />  <br />  我们知道 CoCreateInstance创建组件的过程是:传给他一个CLSID,然后它创建相应的组件.,并返回所请求接口的指针,.CoCreateInstance没有提供一种可以控制组件创建过程的的方法.<br />  <br />  存在问题: 我们不能控制组件创建过程.<br />  解决方案: 使用一个专门创建组件的组件,既 类厂.</p>
		<p>2.类厂.</p>
		<p> 实际上CoCreateInstance并没有创建组件,而是创建了一个被称为类厂的组件.<br /> 类厂唯一功能就是创建其他组件.</p>
		<p> 精确点讲就是.某个特定类厂将创建某个特定CLSID相应的组件. 客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制. 创建组件的标准接口是 IClassFactory,用CoCreateInstance创建的组件实际上是通过IClassFactory来创建的.</p>
		<p>3.CoGetClassObject</p>
		<p>要创建一个组件,首先要创建类厂本身.</p>
		<p>   CoCreateInstance()用来创建与指定CLSID的组件,并返回指向组件某个接口的指针.<br />   与CoCreateInstance类似,用CoGetClassObject() 来创建与指定CLSID的类厂,并返回指向类厂某个接口的指针.</p>
		<p>  函树定义如下:<br />  <br />  HRESULT __stdcall 用CoGetClassObject(</p>
		<p>   const CLSID &amp; clsid,<br />   DWORD  dwClsContext,    //server context<br />   COSERVERINFO *pServerInfo,  //Resevred for DCOM<br />   const IID &amp;iid,<br />   void ** ppv<br />);</p>
		<p> 客户用 CoCreateInstanc 所返回的指针来创建所需的组件,这个指针通常是一个IClassFactory指针.<br /> <br /> 3.IClassFactory<br /> <br /> 类厂所支持的用于创建组件的标准接口是 IClassFactory.大部分组件可以通过它来创建.<br /> 声明如下:<br />  <br /> interface IClassFactory :IUnknown<br /> {<br />  HRESULT stdcall  CreateInstace(IUnknown * pUnknownOuter,<br />                  const IID &amp;iid,<br />                  void **ppv);<br />  HRESULT stdcall LockServer(bool bLock);<br />  };<br />  <br /> 4.为什么要用用CoGetClassObject<br /><br />大多数情况下使用 CoCreateInstanc 创建组件，而不使用CoGetClassObject。但是在以下两种情况  下应使用CoGetClassObject而不使用 CoCreateInstanc 。<br />1、若想用不同于 IClassFactory 的某个创建接口来创建组件，则必须使用CoGetClassObject。<br />2、若需要创建同一组件的多个不同实例，使用CoGetClassObject可以取得较高效率。因为这样只需相应组件的类厂一次，而CoCreateInstanc 需要为每个实例分别创建并释放相应的类厂。<br />另外，CoGetClassObject可以对组件的创建过程进行更多的控制。</p>
<img src ="http://www.cppblog.com/ivenher/aggbug/16460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-12-14 21:53 <a href="http://www.cppblog.com/ivenher/articles/16460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com笔记八  类厂</title><link>http://www.cppblog.com/ivenher/articles/16459.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Dec 2006 13:41:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/16459.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/16459.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/16459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/16459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/16459.html</trackback:ping><description><![CDATA[
		<p>
				<strong>创建一个组件最简单的方法</strong>
		</p>
		<p>1,创建一个组件最简单的方法:用 CoCreateInstanc函数.因此CoCreateInstanc也是创建组件用的最多的一种方法.但其灵活性有限,不能满足所有组件的需求. 这就是为什么要引入类厂.</p>
		<p> 所有组件都是用类厂创建的.  CoCreateInstanc也是按照一般方法通过类厂来创建组件的.</p>
		<p>2. CoCreateInstanc</p>
		<p>com库中包含一个创建组件的名为CoCreateInstanc的函数.</p>
		<p>定义如下:</p>
		<p>HRESULT __stdcall CoCreateInstanc(</p>
		<p>   const CLSID &amp; clsid,<br />   IUnknown * pIUnknown,   //outer component<br />   DWORD  dwClsContext,    //server context<br />   const IID &amp;iid,<br />   void ** ppv<br />);</p>
		<p>看以看到有四个输入参数一个输出参数.<br />第一个待创建组件的CLSID.<br />第二个是用来聚合组件的.<br />第三个是用来限定所创建组件的执行上下文.<br />第四个是组件待使用的接口的IID;<br />CoCreateInstanc将在最后一个参数中返回此接口指针. <br />将一个IID 传给CoCreateInstanc,客户将无需在创建组件后再调用QueryInterface;</p>
		<p>
				<br />3.CoCreateInstanc的使用</p>
		<p>  IX *pIX = NULL;<br />  HRESULT  hr = CoCreateInstanc(CLSID_component1,<br />                                NULL,<br />                                CLSCTX_INPROC_SERVER,<br />                                IID_IX,<br />                                (void **)&amp;pIX);</p>
		<p>  if(SUCCEEDED(hr))<br /> {<br />  pIX-&gt;Fx();<br />  pIX-&gt;Release();<br />  } </p>
		<p>
				<br />该例子创建了一个由CLSID_component1标志的组件.<br />此处不需要聚合组件,因此第二个参数之NULL;<br />我们用IID_IX来表示希望得到接口IIX的指针,CoCreateInstanc将把此指针返回在pIX变量中,若成功返回则可用该接口.Release()表示对接口和组件的使用已经完成.</p>
		<p>类上下文</p>
		<p>CoCreateInstanc的第三个参数可以控制所创建的组件是在客户创建的进程中运行,还是在不同进程中.或者在另外一台机器上.</p>
		<p>该参数可以由一下几个值组合:</p>
		<p>CLSCTX_INPROC_SERVER, <br />CLSCTX_INPROC_HANDLER,<br />CLSCTX_LOCAL_SERVER,<br />CLSCTX_REMOTE_SERVER;<br />客户可以在三种不同上下文中使用某个组件: 进程中,本地,远程.<br /></p>
<img src ="http://www.cppblog.com/ivenher/aggbug/16459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-12-14 21:41 <a href="http://www.cppblog.com/ivenher/articles/16459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com  笔记七 com库</title><link>http://www.cppblog.com/ivenher/articles/1261.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1261.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1261.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1261.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1261.html</trackback:ping><description><![CDATA[<P>所有com组件和客户需要一些相同操作，为保证这些操作是按标准来的，com定义了一个函数库来实现所有这些操作。此函数库是在 ole32.dll中实现的。在使用静态链接时，可以使用ole32.lib。<BR><BR>com库的初始化，除了CoBuildVersion必须首先调用CoInitialize来初始化com库函数。当进程不再需要库函数时，必须调用CoUninitialize。<BR>&nbsp;&nbsp;&nbsp;对于一个进程只需初始化一次com库，如果多次初始化，必须保证每个都有对应的CoUninitialize.<BR><BR>OleInitialize基于com，增添了更多功能。<BR><BR>内存管理。<BR><BR>在组件中分配一块内存，产生问题：有谁来释放？ 如何释放？<BR><BR>com解决这一问题方案是：提供一个任务内存分配器。使用它，com可以提供一块可以由客户删除的内存。</P><img src ="http://www.cppblog.com/ivenher/aggbug/1261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 16:50 <a href="http://www.cppblog.com/ivenher/articles/1261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com 笔记六 HRESULT，GUID及注册表</title><link>http://www.cppblog.com/ivenher/articles/1260.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1260.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1260.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1260.html</trackback:ping><description><![CDATA[HRESULT 为一个可以分为三个域的32位值。<BR>&nbsp;<IMG src="file:///C:/Documents%20and%20Settings/ivenher/桌面/%7B18AF60EC-78B2-46F2-A76B-CC9288735984%7D.JPG"><BR><BR>自定义HRESULT一般规则：<BR><BR>1、不要将0x0000到0x01FF范围内作为返回码。<BR>2、不要传播FACILITY_ITF错误代码。<BR>3、尽可能使用通用com成功或失败代码。<BR>4、避免定义自己的 HRESULT，可以在函数中使用输出参数。<BR><BR>利用MAKE_HRESULT宏来定一个HRESULT值。<BR><BR><BR>GUID<BR>是一个128位16字节的GUID结构。<BR>MS提供两个工具生成GUID，一个是UUIDGEN。EXE&nbsp;&nbsp; 另一个是 GUIDGEN.EXE。<BR><BR>定义一个GUID:<BR>extern "C"&nbsp;&nbsp;&nbsp; const&nbsp;&nbsp; IID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IX&nbsp; =&nbsp; <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.....<BR>}<BR>声明：<BR>extern "C"&nbsp;&nbsp;&nbsp;congst&nbsp;&nbsp;&nbsp;IID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IID_IX;<BR><BR>或者宏<BR><BR>DEFINE_GUID(IID_IX, .....);<BR><BR><BR>将一个GUID做为组件标志符。<BR>IUnknown&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; CoCreateInstance(.....);<BR><BR>com中用以标志组件的GUID被称为类标志符，用CLSID与IID区分。<BR><BR><BR>通过引用传递GUID。<BR><BR>注册表。<BR>CoCreateInstance将利用CLSID作为关键字在注册表中找所需文件名。<BR><BR>com只用了这册表的一个分支：HKEY_CLASSES_ROOT,&nbsp; 其下有一个CLSID关键字，其下列有系统中安装的所有组件的CLSID。<BR><img src ="http://www.cppblog.com/ivenher/aggbug/1260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 16:30 <a href="http://www.cppblog.com/ivenher/articles/1260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com 笔记五  动态链接</title><link>http://www.cppblog.com/ivenher/articles/1259.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 07:02:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1259.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1259.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1259.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1259.html</trackback:ping><description><![CDATA[如何将一个组件放到一个DLL中。<BR>com不是DLL。DLL只是一个组件服务器，或者说是一中发行组件的方式。<img src ="http://www.cppblog.com/ivenher/aggbug/1259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 15:02 <a href="http://www.cppblog.com/ivenher/articles/1259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com 笔记 五 ----计数器</title><link>http://www.cppblog.com/ivenher/articles/1257.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1257.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1257.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1257.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1257.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1257.html</trackback:ping><description><![CDATA[interface&nbsp;&nbsp; IUnknown<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__stdcall&nbsp; QueryInterface(const&nbsp; IID &amp;&amp; iid,&nbsp; void&nbsp; * *ppv) = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __stdcall&nbsp; AddRef() =&nbsp; 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__stdcall&nbsp; Release() =&nbsp; 0;<BR>}<BR><BR>引用计数简介：<BR>AddRef 和 Release实现的是一种名为引用计数器的内存管理技术。引用计数是使组件能将自身删除最简单也是效率最高的方法。<BR><BR>计数器使用规则：<BR>1、返回之前调用AddRef（）；<BR>2、使用完接口调用Release（）；<BR>3、赋值之后调用AddRef。再将一个接口指针赋给另一个接口指针时，应调用AddRef。<img src ="http://www.cppblog.com/ivenher/aggbug/1257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 14:29 <a href="http://www.cppblog.com/ivenher/articles/1257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com笔记 四 （小结一 ）</title><link>http://www.cppblog.com/ivenher/articles/1256.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1256.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1256.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1256.html</trackback:ping><description><![CDATA[小结：<BR>com组件是以动态链接库（DLLS）或者可执行文件（EXES)形式发布的可执行代码组成。<BR>com组件是动态链接的。<BR><BR>QueryInterface <BR>是将com组件同c++类分开的一种特性。<BR><BR>com组件的大部分灵活性及封装的能力都有其提供。<BR>它使得客户能在运行时决定一个组件所能提供的功能。<BR>将组件的功能完全的向客户隐藏。<BR>极好的实现对版本的无缝处理。<BR><BR>IUnknown接口。<BR>所有接口的根接口。<img src ="http://www.cppblog.com/ivenher/aggbug/1256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 13:59 <a href="http://www.cppblog.com/ivenher/articles/1256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>com 笔记 三</title><link>http://www.cppblog.com/ivenher/articles/1255.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Wed, 23 Nov 2005 05:53:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/1255.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/1255.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/1255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/1255.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/1255.html</trackback:ping><description><![CDATA[同一个IUnknown接口。<BR>组建的实例只有一个IUnknown接口，可以通过它确定两个接口是否属于同一组件。<BR><BR>BOOL&nbsp;&nbsp; SameComponents(IX *pIX,IY *pIY)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IUnknown * pI1=NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IUnknown * pI2= NULL;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIX-&gt;QueryInterface(IID_IUnknown,(void *)&amp;pI1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIY-&gt;QueryInterface(IID_IUnknown,(void *)&amp;pI2);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp; pIX==pIY;<BR>}<BR><BR><BR>版本控制。<BR>何时建立新版本：但以下任何一个改变时<BR>1、接口函数数目。<BR>2、接口中函数顺序。<BR>3、某个函数参数。<BR>4、某个函数参数顺序。<BR>5、函数可能的返回值。<BR>6、函数返回值类型。<BR>7、接口中函数的意义。<BR><BR>版本命名。<BR>com关于新版本名称约定是在老名称后边加一个数字。<BR><BR><img src ="http://www.cppblog.com/ivenher/aggbug/1255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-23 13:53 <a href="http://www.cppblog.com/ivenher/articles/1255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM学习笔记 二</title><link>http://www.cppblog.com/ivenher/articles/890.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Tue, 01 Nov 2005 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/890.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/890.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/890.html</trackback:ping><description><![CDATA[<P>一，QueryInterface函数<BR>原型：</P>
<P>HRESULT&nbsp; __stdcall&nbsp;QueryInterface(const&nbsp;IID&amp;iid,void **ppv);</P>
<P>iid：标志客户所需的接口。是”一个接口标志符“结构（IID）。<BR>ppv：QueryInterface用来存放所请求接口的地址。</P>
<P>返回值：可以返回S_OK 或 E_NOINTERFACE应该用SUCEEDED或者FAILED宏验证是否成功。</P>
<P>使用方法：</P>
<P>假如知道一个指向IUnknown接口的指针pI，传给它一个接口标志符即可</P>
<P>例如：<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Foo(IUnknown&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pI)<BR><IMG id=Codehighlighter1_24_141_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_141_Open_Text.style.display='none'; Codehighlighter1_24_141_Closed_Image.style.display='inline'; Codehighlighter1_24_141_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_24_141_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_24_141_Closed_Text.style.display='none'; Codehighlighter1_24_141_Open_Image.style.display='inline'; Codehighlighter1_24_141_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_24_141_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_24_141_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;IX&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pIX&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pI</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">QueryInterface(IID_IX,(</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">**</SPAN><SPAN style="COLOR: #000000">)pIX);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(SUCCEEDED(hr))<BR><IMG id=Codehighlighter1_121_139_Open_Image onclick="this.style.display='none'; Codehighlighter1_121_139_Open_Text.style.display='none'; Codehighlighter1_121_139_Closed_Image.style.display='inline'; Codehighlighter1_121_139_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_121_139_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_139_Closed_Text.style.display='none'; Codehighlighter1_121_139_Open_Image.style.display='inline'; Codehighlighter1_121_139_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_121_139_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_121_139_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIX</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">FX();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">QueryInterface的实现。</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;_stdcall&nbsp;&nbsp;CA::QueryInterface(</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;IID</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">iid,</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">**</SPAN><SPAN style="COLOR: #000000">ppv)<BR><IMG id=Codehighlighter1_229_567_Open_Image onclick="this.style.display='none'; Codehighlighter1_229_567_Open_Text.style.display='none'; Codehighlighter1_229_567_Closed_Image.style.display='inline'; Codehighlighter1_229_567_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_229_567_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_567_Closed_Text.style.display='none'; Codehighlighter1_229_567_Open_Image.style.display='inline'; Codehighlighter1_229_567_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_229_567_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_229_567_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(iid&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;IID_IUnknown)<BR><IMG id=Codehighlighter1_257_295_Open_Image onclick="this.style.display='none'; Codehighlighter1_257_295_Open_Text.style.display='none'; Codehighlighter1_257_295_Closed_Image.style.display='inline'; Codehighlighter1_257_295_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_257_295_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_257_295_Closed_Text.style.display='none'; Codehighlighter1_257_295_Open_Image.style.display='inline'; Codehighlighter1_257_295_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_257_295_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_257_295_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ppv&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;static_cast</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">IX&nbsp;</SPAN><SPAN style="COLOR: #000000">*&gt;</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(iid&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;IID_IX)<BR><IMG id=Codehighlighter1_323_361_Open_Image onclick="this.style.display='none'; Codehighlighter1_323_361_Open_Text.style.display='none'; Codehighlighter1_323_361_Closed_Image.style.display='inline'; Codehighlighter1_323_361_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_323_361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_361_Closed_Text.style.display='none'; Codehighlighter1_323_361_Open_Image.style.display='inline'; Codehighlighter1_323_361_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_323_361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_323_361_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ppv&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;static_cast</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">IX&nbsp;</SPAN><SPAN style="COLOR: #000000">*&gt;</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(iid&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;IID_IY)<BR><IMG id=Codehighlighter1_389_427_Open_Image onclick="this.style.display='none'; Codehighlighter1_389_427_Open_Text.style.display='none'; Codehighlighter1_389_427_Closed_Image.style.display='inline'; Codehighlighter1_389_427_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_389_427_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_389_427_Closed_Text.style.display='none'; Codehighlighter1_389_427_Open_Image.style.display='inline'; Codehighlighter1_389_427_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_389_427_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_389_427_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ppv&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;static_cast</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">IY&nbsp;</SPAN><SPAN style="COLOR: #000000">*&gt;</SPAN><SPAN style="COLOR: #000000">(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(iid&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;IID_IUnknown)<BR><IMG id=Codehighlighter1_461_505_Open_Image onclick="this.style.display='none'; Codehighlighter1_461_505_Open_Text.style.display='none'; Codehighlighter1_461_505_Closed_Image.style.display='inline'; Codehighlighter1_461_505_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_461_505_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_461_505_Closed_Text.style.display='none'; Codehighlighter1_461_505_Open_Image.style.display='inline'; Codehighlighter1_461_505_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_461_505_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_461_505_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">ppv&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;NULL;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;E_NOINTERFACE;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;static_cast&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">IUnknown&nbsp;</SPAN><SPAN style="COLOR: #000000">*&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;ppv)</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">AddRef();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;retru&nbsp;S_OK;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P><BR><BR>多重继承及类型转换。</P>
<P>通常将一种类型的指针转换为另一种类型并不会改变它的值。为了支持多重继承，某些情况下，C++必须改变类指针的值。<BR>假如一个类定义如下：</P>
<P>class CA: public IX,public IY{...};</P>
<P>由于CA同时继承了IX，IY因此可以使用IX或IY指针的地方均可以使用指向CA的指针。</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;foo(IX</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pIX);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;bar(IY</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pIY);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main()<BR><IMG id=Codehighlighter1_49_112_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_112_Open_Text.style.display='none'; Codehighlighter1_49_112_Closed_Image.style.display='inline'; Codehighlighter1_49_112_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_49_112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_112_Closed_Text.style.display='none'; Codehighlighter1_49_112_Open_Image.style.display='inline'; Codehighlighter1_49_112_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_49_112_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_49_112_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;CA</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pA&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;foo(pA);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;bar(pA);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;delete&nbsp;pA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P>foo需要一个指向合法的IX的虚拟函数表的指针；<BR>bar需要一个指向合法的IY的虚拟函数表的指针；<BR>当然IX和IY的虚拟函数表的内容是不一样的。因此将一个IX vtbl传给bar时，此函数是不能正常工作的。<BR>因此编译器将同一指针传给foo和bar是不可能的，它必须对CA的指针进行修改以便他指向一个合适的vtbl指针。<BR>下图显示了CA对象的内存结构。<BR><BR><IMG height=432 alt=2.jpg src="http://www.cppblog.com/images/cppblog_com/ivenher/com/2.jpg" width=722 border=0><BR><BR></P><img src ="http://www.cppblog.com/ivenher/aggbug/890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-11-01 16:56 <a href="http://www.cppblog.com/ivenher/articles/890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM学习笔记 一</title><link>http://www.cppblog.com/ivenher/articles/835.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Mon, 24 Oct 2005 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/835.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/835.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/835.html</trackback:ping><description><![CDATA[<P>接口的实现。<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;IX<BR><IMG id=Codehighlighter1_9_71_Open_Image onclick="this.style.display='none'; Codehighlighter1_9_71_Open_Text.style.display='none'; Codehighlighter1_9_71_Closed_Image.style.display='inline'; Codehighlighter1_9_71_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_9_71_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_9_71_Closed_Text.style.display='none'; Codehighlighter1_9_71_Open_Image.style.display='inline'; Codehighlighter1_9_71_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_9_71_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_9_71_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fx1()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fx2()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;IY<BR><IMG id=Codehighlighter1_84_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_84_146_Open_Text.style.display='none'; Codehighlighter1_84_146_Closed_Image.style.display='inline'; Codehighlighter1_84_146_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_84_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_84_146_Closed_Text.style.display='none'; Codehighlighter1_84_146_Open_Image.style.display='inline'; Codehighlighter1_84_146_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_84_146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_84_146_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fy1()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fy2()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">&nbsp;;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CA:&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;IX,<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;IY<BR><IMG id=Codehighlighter1_184_366_Open_Image onclick="this.style.display='none'; Codehighlighter1_184_366_Open_Text.style.display='none'; Codehighlighter1_184_366_Closed_Image.style.display='inline'; Codehighlighter1_184_366_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_184_366_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_184_366_Closed_Text.style.display='none'; Codehighlighter1_184_366_Open_Image.style.display='inline'; Codehighlighter1_184_366_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_184_366_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_184_366_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fx1()<BR><IMG id=Codehighlighter1_215_235_Open_Image onclick="this.style.display='none'; Codehighlighter1_215_235_Open_Text.style.display='none'; Codehighlighter1_215_235_Closed_Image.style.display='inline'; Codehighlighter1_215_235_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_215_235_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_215_235_Closed_Text.style.display='none'; Codehighlighter1_215_235_Open_Image.style.display='inline'; Codehighlighter1_215_235_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_215_235_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_215_235_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Fx1()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fx2()<BR><IMG id=Codehighlighter1_258_278_Open_Image onclick="this.style.display='none'; Codehighlighter1_258_278_Open_Text.style.display='none'; Codehighlighter1_258_278_Closed_Image.style.display='inline'; Codehighlighter1_258_278_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_258_278_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_258_278_Closed_Text.style.display='none'; Codehighlighter1_258_278_Open_Image.style.display='inline'; Codehighlighter1_258_278_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_258_278_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_258_278_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Fx2()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fy1()<BR><IMG id=Codehighlighter1_301_321_Open_Image onclick="this.style.display='none'; Codehighlighter1_301_321_Open_Text.style.display='none'; Codehighlighter1_301_321_Closed_Image.style.display='inline'; Codehighlighter1_301_321_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_301_321_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_301_321_Closed_Text.style.display='none'; Codehighlighter1_301_321_Open_Image.style.display='inline'; Codehighlighter1_301_321_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_301_321_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_301_321_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Fy1()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Fy2()<BR><IMG id=Codehighlighter1_344_364_Open_Image onclick="this.style.display='none'; Codehighlighter1_344_364_Open_Text.style.display='none'; Codehighlighter1_344_364_Closed_Image.style.display='inline'; Codehighlighter1_344_364_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_344_364_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_344_364_Closed_Text.style.display='none'; Codehighlighter1_344_364_Open_Image.style.display='inline'; Codehighlighter1_344_364_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN id=Codehighlighter1_344_364_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_344_364_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Fy2()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P><BR>相关概念：纯抽象基类：指包含纯抽象函数的基类。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;纯虚构函数：用 =0 标记的虚构函数。<BR>多重继承：指一个类直接继承一个以上的基类。<BR>对纯虚函数的继承称为接口继承。<BR>IX和IY并不是真正意义上的COM接口，为使之成为COM接口，它必须继承一个名为IUnknown的接口。<BR></P><BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG id=Codehighlighter1_0_15_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_15_Open_Text.style.display='none'; Codehighlighter1_0_15_Closed_Image.style.display='inline'; Codehighlighter1_0_15_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_0_15_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_15_Closed_Text.style.display='none'; Codehighlighter1_0_15_Open_Image.style.display='inline'; Codehighlighter1_0_15_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN id=Codehighlighter1_0_15_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_0_15_Open_Text><SPAN style="COLOR: #808080">///</SPAN><SPAN style="COLOR: #008000">interface.h&nbsp;</SPAN><SPAN style="COLOR: #808080"></SPAN></SPAN><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">iostream.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">objbase.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_91_109_Open_Image onclick="this.style.display='none'; Codehighlighter1_91_109_Open_Text.style.display='none'; Codehighlighter1_91_109_Closed_Image.style.display='inline'; Codehighlighter1_91_109_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_91_109_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_91_109_Closed_Text.style.display='none'; Codehighlighter1_91_109_Open_Image.style.display='inline'; Codehighlighter1_91_109_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;trace(</SPAN><SPAN style="COLOR: #0000ff">const</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pMsg)</SPAN><SPAN id=Codehighlighter1_91_109_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_91_109_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">pMsg</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">interface</SPAN><SPAN style="COLOR: #000000">&nbsp;IX<BR><IMG id=Codehighlighter1_125_197_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_197_Open_Text.style.display='none'; Codehighlighter1_125_197_Closed_Image.style.display='inline'; Codehighlighter1_125_197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_125_197_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_197_Closed_Text.style.display='none'; Codehighlighter1_125_197_Open_Image.style.display='inline'; Codehighlighter1_125_197_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_125_197_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_125_197_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fx1()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fx2()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">interface</SPAN><SPAN style="COLOR: #000000">&nbsp;IY<BR><IMG id=Codehighlighter1_213_285_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_285_Open_Text.style.display='none'; Codehighlighter1_213_285_Closed_Image.style.display='inline'; Codehighlighter1_213_285_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_213_285_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_285_Closed_Text.style.display='none'; Codehighlighter1_213_285_Open_Image.style.display='inline'; Codehighlighter1_213_285_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_213_285_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_213_285_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fy1()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fy2()&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CA:&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;IX,<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;IY<BR><IMG id=Codehighlighter1_327_562_Open_Image onclick="this.style.display='none'; Codehighlighter1_327_562_Open_Text.style.display='none'; Codehighlighter1_327_562_Closed_Image.style.display='inline'; Codehighlighter1_327_562_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_327_562_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_327_562_Closed_Text.style.display='none'; Codehighlighter1_327_562_Open_Image.style.display='inline'; Codehighlighter1_327_562_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_327_562_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_327_562_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">:<BR><IMG id=Codehighlighter1_366_391_Open_Image onclick="this.style.display='none'; Codehighlighter1_366_391_Open_Text.style.display='none'; Codehighlighter1_366_391_Closed_Image.style.display='inline'; Codehighlighter1_366_391_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_366_391_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_366_391_Closed_Text.style.display='none'; Codehighlighter1_366_391_Open_Image.style.display='inline'; Codehighlighter1_366_391_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fx1()</SPAN><SPAN id=Codehighlighter1_366_391_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_366_391_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">CA::Fx1()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_422_447_Open_Image onclick="this.style.display='none'; Codehighlighter1_422_447_Open_Text.style.display='none'; Codehighlighter1_422_447_Closed_Image.style.display='inline'; Codehighlighter1_422_447_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_422_447_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_422_447_Closed_Text.style.display='none'; Codehighlighter1_422_447_Open_Image.style.display='inline'; Codehighlighter1_422_447_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fx2()</SPAN><SPAN id=Codehighlighter1_422_447_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_422_447_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">CA::Fx2()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_479_504_Open_Image onclick="this.style.display='none'; Codehighlighter1_479_504_Open_Text.style.display='none'; Codehighlighter1_479_504_Closed_Image.style.display='inline'; Codehighlighter1_479_504_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_479_504_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_479_504_Closed_Text.style.display='none'; Codehighlighter1_479_504_Open_Image.style.display='inline'; Codehighlighter1_479_504_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fy1()</SPAN><SPAN id=Codehighlighter1_479_504_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_479_504_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">CA::Fy1()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_535_560_Open_Image onclick="this.style.display='none'; Codehighlighter1_535_560_Open_Text.style.display='none'; Codehighlighter1_535_560_Closed_Image.style.display='inline'; Codehighlighter1_535_560_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_535_560_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_535_560_Closed_Text.style.display='none'; Codehighlighter1_535_560_Open_Image.style.display='inline'; Codehighlighter1_535_560_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;__stdcall&nbsp;Fy2()</SPAN><SPAN id=Codehighlighter1_535_560_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_535_560_Open_Text><SPAN style="COLOR: #000000">{cout</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">CA::Fy2()</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;&lt;</SPAN><SPAN style="COLOR: #000000">endl;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;com_1.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">stdafx.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>#include&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">IFace.h</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;main(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;argc,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">char</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;argv[])<BR><IMG id=Codehighlighter1_710_1024_Open_Image onclick="this.style.display='none'; Codehighlighter1_710_1024_Open_Text.style.display='none'; Codehighlighter1_710_1024_Closed_Image.style.display='inline'; Codehighlighter1_710_1024_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_710_1024_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_710_1024_Closed_Text.style.display='none'; Codehighlighter1_710_1024_Open_Image.style.display='inline'; Codehighlighter1_710_1024_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_710_1024_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_710_1024_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;trace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Create&nbsp;an&nbsp;instance&nbsp;of&nbsp;the&nbsp;componet!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;CA&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pA&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;IX&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pIX&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;trace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">use&nbsp;the&nbsp;ix&nbsp;interface!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pIX</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">Fx1();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pIX</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">Fx2();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;IY&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;pIY&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;pA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;trace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">use&nbsp;the&nbsp;iy&nbsp;interface!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pIY</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">Fy1();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pIY</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">Fy2();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;pA</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">Fx1();<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;trace(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">delete&nbsp;the&nbsp;componet!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;delete&nbsp;pA;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;printf(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;World!\n</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>运行结果如下：<BR><IMG height=384 alt=com_1.JPG src="http://www.cppblog.com/images/cppblog_com/ivenher/com/com_1.JPG" width=512 border=0><BR><BR><FONT color=#a52a2a>总结：<BR>1、COM接口在c++中用纯抽象基类实现。<BR>2、一个COM组件可以提供多个接口。<BR>3、一个C++类可以使用多继承实现一个提供多个接口的组件。<BR></FONT><FONT color=#000000>在com中，对一个组件的访问只能通过函数，而决不能直接通过变量。</FONT></P><img src ="http://www.cppblog.com/ivenher/aggbug/835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2005-10-24 17:50 <a href="http://www.cppblog.com/ivenher/articles/835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>