﻿<?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++博客-YXM blog-随笔分类-COM/ATL/WTL</title><link>http://www.cppblog.com/yxm/category/2806.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 May 2008 09:56:34 GMT</lastBuildDate><pubDate>Mon, 26 May 2008 09:56:34 GMT</pubDate><ttl>60</ttl><item><title>完整的WTL文档</title><link>http://www.cppblog.com/yxm/archive/2006/11/22/15539.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Wed, 22 Nov 2006 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/11/22/15539.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/15539.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/11/22/15539.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/15539.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/15539.html</trackback:ping><description><![CDATA[
		<p>下载地址：<a href="/Files/yxm/wtldoc.rar">http://www.cppblog.com/Files/yxm/wtldoc.rar</a></p>
<img src ="http://www.cppblog.com/yxm/aggbug/15539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-11-22 15:18 <a href="http://www.cppblog.com/yxm/archive/2006/11/22/15539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 &amp;&amp; CVT1100: 重复的资源 解决方法</title><link>http://www.cppblog.com/yxm/archive/2006/10/26/14243.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Thu, 26 Oct 2006 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/26/14243.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/14243.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/26/14243.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/14243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/14243.html</trackback:ping><description><![CDATA[
		<p>详细内容请看微软官方说明：<a href="http://support.microsoft.com/kb/320216/zh-cn">http://support.microsoft.com/kb/320216/zh-cn</a><br /><br />这里贴上我的解决方法(vs2005环境)：<br /><br />设置工程属性-&gt;配置属性-&gt; 清单工具-&gt;输入和输出-&gt;嵌入清单，选择[否]，确定后重新生成即可。<br /><br /><br /></p>
<img src ="http://www.cppblog.com/yxm/aggbug/14243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-26 17:11 <a href="http://www.cppblog.com/yxm/archive/2006/10/26/14243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写、发布安全的ActiveX控件</title><link>http://www.cppblog.com/yxm/archive/2006/10/23/14045.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Mon, 23 Oct 2006 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/23/14045.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/14045.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/23/14045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/14045.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/14045.html</trackback:ping><description><![CDATA[
		<p>
				<strong>一、指出ActiveX控件对于脚本与数据初始化是安全的<br /></strong>
				<br />1.  将下行添加到组件的继承列表的末尾：</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">public</span>
				<span style="COLOR: #000000"> IObjectSafetyImpl</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">CPolyCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER  </span>
				<span style="COLOR: #000000">| </span>
				<span style="COLOR: #000000"> INTERFACESAFE_FOR_UNTRUSTED_DATA</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<br />2.  将下行添加到COM 映射： <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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">COM_INTERFACE_ENTRY(IObjectSafety)</span></div><br /><strong>二、电子签名<br /></strong>可使用 MAKECERT 和 CERT2SPC 实用工具生成测试 Software Publisher Certificate。请注意，此测试 SPC 对软件发布无效，但可用于测试<a href="http://msdn.microsoft.com/library/CHS/vccore/html/_vccore_signing_a_cab_file.asp">代码签名</a>。<br /><br />1.  创建证书文件：<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; HEIGHT: 30px; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">makecert  </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sv  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">私钥文件.pvk</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">n </span><span style="COLOR: #000000">"CN</span><span style="COLOR: #000000">=公司的名字</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">  </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">证书文件名.cer</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注意保留扩展名</span></div><p>2.  转换cer格式为spc格式：<br /><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: #000000">cert2spc   dream.cer   dream.spc   </span></div><p>3.  给cab文件签名</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: #000000">signtool signwizard</span></div><p>4.  在web页上嵌套入签名的CAB文件<br /><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">&lt;</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">OBJECT </span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">="PolyCtl"</span><span style="COLOR: #ff0000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CLASSID</span><span style="COLOR: #0000ff">="CLSID:4CBBC676-507F-11D0-B98B-000000000000"</span><span style="COLOR: #ff0000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />CODEBASE</span><span style="COLOR: #0000ff">="http://example.sq-soft.com/mydir/myctl.cab<font color="#0000ff">#version=1,0,0,1</font>"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">OBJECT</span><span style="COLOR: #0000ff">&gt;</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">&lt;/</span><span style="COLOR: #800000">BODY</span><span style="COLOR: #0000ff">&gt;</span></div><p>CODEBASE 也可以直接指向 OCX 或 DLL 文件：</p><p></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: #000000"><font color="#ff0000">CODEBASE</font><font color="#0000ff">="</font><a href="http://example.sq-soft.com/mydir/myctl.dll#version=1,0,0,1"><font color="#0000ff">http://example.sq-soft.com/mydir/myctl.dll#version=1,0,0,1</font></a><font color="#0000ff">"</font><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br /><strong>三、创建CAB文件(摘录自MSDN）</strong><br /><br />1.  创建INF文件<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: #000000">; Sample INF file </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> POLYGON.DLL<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />[version] <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />; version signature (same </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> both NT and Win95) </span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000"> not remove<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />signature</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">$CHICAGO$</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />AdvancedINF</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">2.0</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" />[Add.Code]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />polygon.dll</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">polygon.dll<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />atl.dll</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">atl.dll<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" />; needed DLL<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />[atl.dll]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />file</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">win32</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">thiscab<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />FileVersion</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">00</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7024</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />DestDir</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />RegisterServer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">yes <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" />[polygon.dll]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />file</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">win32</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">thiscab<br /><img id="Codehighlighter1_346_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_346_383_Open_Text.style.display='none'; Codehighlighter1_346_383_Closed_Image.style.display='inline'; Codehighlighter1_346_383_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_346_383_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_346_383_Closed_Text.style.display='none'; Codehighlighter1_346_383_Open_Image.style.display='inline'; Codehighlighter1_346_383_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />clsid</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_346_383_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_346_383_Open_Text"><span style="COLOR: #000000">{4CBBC676</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">507F</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">11D0</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">B98B</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">000000000000</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />FileVersion</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />RegisterServer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">yes  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />; end of INF file<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />其中“thiscab”是一个关键字，表示 CAB 包含此 DLL，也可通过指定一条绝对或相对路径，从一个 HTTP 位置下载所需的 DLL，例如：<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">file</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">win32</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">http:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">example.microsoft.com/mydir/NEEDED.DLL </span></div><p>关键字“file-win32-x86”将平台标识为 x86 特定的。</p><p>可通过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。从显示的列表中选择“属性”，然后在显示的对话框中选择“版本”选项卡。有时需要在文件版本中额外插入一个 0。例如，在对话框中 ATL.DLL 的版本号显示为 2.00.7024。而在 INF 文件中，这变为 2, 00, 0, 7024。</p><p>“DestDir”是将要加载文件的目录所在的位置：11 指定系统目录为 WINDOWS/SYSTEM 或 WINNT/SYSTEM32；10 指定 Windows 目录、WINDOWS 或 WINNT。如果未指定任何 DestDir（典型情况），则代码安装在固定的 OCCACHE 目录中。</p><p>“clsid”是将要安装的控件的 CLSID。<br /><br />2.  创建CAB文件<br /><br />创建了 INF 文件后，运行 CABARC 实用工具以创建 CAB 文件。应在包含源文件的目录下运行 CABARC。在命令行上，按源文件出现在 INF 中的顺序排列它们，并将 INF 文件放在最后。例如：</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"><span style="COLOR: #000000">CABARC </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">s </span><span style="COLOR: #000000">6144</span><span style="COLOR: #000000">  n  MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF</span></div><p>应在包含源文件（INF、OCX 和 DLL 文件）的目录下运行 CABARC。将在 CAB 文件中存档的文件应该按它们在 INF 文件中列出的同一顺序在命令行中列出。在上面的示例中，INF 文件应该将 NEEDED1.DLL 列在第一位，接下来是 NEEDED2.DLL，然后是 MYCTL.OCX。</p><p><b>-s</b> 选项在压缩文件中保留用于<a href="http://msdn.microsoft.com/library/CHS/vccore/html/_vccore_signing_a_cab_file.asp">代码签名</a>的空间。<b>n</b> 命令指定希望创建 CAB 文件。<br /> </p><img src ="http://www.cppblog.com/yxm/aggbug/14045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-23 17:28 <a href="http://www.cppblog.com/yxm/archive/2006/10/23/14045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无效的参数错误(E_INVALIDARG)</title><link>http://www.cppblog.com/yxm/archive/2006/10/20/13894.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Fri, 20 Oct 2006 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/20/13894.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/13894.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/20/13894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/13894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/13894.html</trackback:ping><description><![CDATA[
		<p>今天在实现一个COM的事件接收器的时，客户端经过ATL事件映射后，运行时返回：E_INVALIDARG，调试跟踪也没有发现参数不对。折腾了好久后，发现客户端的事件函数的调用约定应为__stdcall，应该与所有的COM接口函数一样使用__stdcall调用约定。犯了一个愚蠢的错误。</p>
<img src ="http://www.cppblog.com/yxm/aggbug/13894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-20 11:52 <a href="http://www.cppblog.com/yxm/archive/2006/10/20/13894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM组件类别未注册的问题</title><link>http://www.cppblog.com/yxm/archive/2006/10/17/13781.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Tue, 17 Oct 2006 09:37:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/17/13781.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/13781.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/17/13781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/13781.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/13781.html</trackback:ping><description><![CDATA[
		<p>今天在聚合一个COM组件的时候，一开始使用智能指针创建时报错：“组件没有注册类别”，但检查注册确实已经注册了，而在使用原始指针时报错：“类别不支持聚合”。后来经过仔细调试发现是由于在聚合组件FinalConstruct中的CoCreateInstance参数有错。在使用智能指针时报的错误真是让人不知道是怎么回事。</p>
<img src ="http://www.cppblog.com/yxm/aggbug/13781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-17 17:37 <a href="http://www.cppblog.com/yxm/archive/2006/10/17/13781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"xxx.h 由MIDL生成但无法使用"　的问题</title><link>http://www.cppblog.com/yxm/archive/2006/10/17/13777.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Tue, 17 Oct 2006 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/17/13777.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/13777.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/17/13777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/13777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/13777.html</trackback:ping><description><![CDATA[
		<p>在新增ATL简单对象的时候，新对象的名称不能与工程同名，否则会有此问题。</p>
<img src ="http://www.cppblog.com/yxm/aggbug/13777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-17 15:25 <a href="http://www.cppblog.com/yxm/archive/2006/10/17/13777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM——事件接收器实现方法总结</title><link>http://www.cppblog.com/yxm/archive/2006/10/13/13633.html</link><dc:creator>yxm</dc:creator><author>yxm</author><pubDate>Fri, 13 Oct 2006 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/yxm/archive/2006/10/13/13633.html</guid><wfw:comment>http://www.cppblog.com/yxm/comments/13633.html</wfw:comment><comments>http://www.cppblog.com/yxm/archive/2006/10/13/13633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yxm/comments/commentRss/13633.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yxm/services/trackbacks/13633.html</trackback:ping><description><![CDATA[
		<p dir="ltr" style="MARGIN-RIGHT: 0px">方法一：使用MFC映射宏，从CCmdTartget派生子类EventSink<br /><br /><font color="#000000"><font style="BACKGROUND-COLOR: #ffffff">1.  .h文件中申明接口、分派ID映射</font></font></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">
				<p>
						<span style="COLOR: #000000">DECLARE_DISPATCH_MAP()<br />DECLARE_INTERFACE_MAP()<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				</p>
		</div>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">2.   .cpp文件实现接口、分派ID映射</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">
				<p>
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">映射分派ID</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">BEGIN_DISPATCH_MAP(cThisClass, CBaseClass)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     DISP_FUNCTION_ID(CThisClass, <br /></span>
						<span style="COLOR: #000000">　　　　　　　　　　　 "</span>
						<span style="COLOR: #000000">ComFunc</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,<br />　　　　　　　　　　 　 DISP_ID, <br />　　　　　　　　　　　   LocalFuncName, <br />　　　　　　　　　　　   VARIANT_RETURN_TYPE, <br />　　　　　　　　　　　   VARIANT_PARAMS_TYPE)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />END_DISPATCH_MAP()<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">映射事件接口</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">BEGIN_INTERFACE_MAP(CThisClass,CBaseClass)    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     INTERFACE_PART(CThisClass, DIID_IEventXX,　Dispatch) </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">这里Dispatch为CCmdTart类的一个结构,该宏填充这个结构</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />END_INTERFACE_MAP()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				</p>
		</div>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">3.  #import "...\组件名.tlb" no_namespace named_guids no_namespace<br /><br />4. 初始化COM库、Dispatch结构并建立连接</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">      CoInitialize(NULL);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">EnableAutomation(<img src="http://www.cppblog.com/images/dot.gif" />);    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">同上面的宏一起实现了IDispatch接口</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">    AfxConnectionAdvise(ComObject</span><span style="COLOR: #000000">,  DIID__IEventXX,  GetIDispatch(FALSE)</span><span style="COLOR: #000000">,  FALSE, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_dwCookie);<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">5.  实现映射函数(LocalFuncName)<br /><br />6.  卸载COM库、取消连接</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: #000000">AfxConnectionUnadvise(<img src="http://www.cppblog.com/images/dot.gif" />)  </span> <br />      CoUnInitialize();</div>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">
				<br />方法二:  使用ATL映射宏，继承IDsipEventImpl <br /><br />1.   #import "...\组件名.tlb" no_namespace named_guids<br /><br />2.  实现事件接收类CEventSink<br /><br />      a.  使用ATL宏定义函数信息结构      </p>
		<div align="left">
				<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: 97.96%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 119px; BACKGROUND-COLOR: #eeeeee">
						<div align="left">
								<span style="COLOR: #000000">_ATL_FUNCTION_INFO FuncInfo </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span id="Codehighlighter1_30_125_Open_Text">
										<span style="COLOR: #000000">{<br />     CC_STDCALL,  </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">调用方式</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #000000">     VT_EMPTY,       </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">返回类型</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #000000">     </span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">,                          </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">参数个数</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span id="Codehighlighter1_104_110_Open_Text">
												<span style="COLOR: #000000">    {VT_I4}</span>
										</span>
										<span style="COLOR: #000000">               </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">参数类型表<br /></span>
										<span style="COLOR: #000000">}</span>
								</span>
								<span style="COLOR: #000000">;</span>
						</div>
				</div>
		</div>
		<p dir="ltr" style="MARGIN-RIGHT: 0px">      b.   ATL宏映射事件函数           </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: #000000">BEGIN_SINK_MAP(CEventSink)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       SINK_ENTRY_INFO(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, DIID_I<img src="http://www.cppblog.com/images/dot.gif" />, DISP_ID, LocalFunc, </span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">FuncINfo)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />       <img src="http://www.cppblog.com/images/dot.gif" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />END_SINK_MAP()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<br /> 3.  实例化组件对象和ＥventSink对象，用EventSink对象或AtlAdvise函数建立连接: EventSink-&gt;Advise(...)　或EventSink-&gt;DispEventAdvise(...)  或 AtlAdvise(...)<br /><br /> 4.  取消连接，销毁对象<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 src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">     #ifndef __EVENTSINK_H<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> __EVENTSINK_H</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">namespace</span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_81_548_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_548_Open_Text.style.display='none'; Codehighlighter1_81_548_Closed_Image.style.display='inline'; Codehighlighter1_81_548_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_81_548_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_81_548_Closed_Text.style.display='none'; Codehighlighter1_81_548_Open_Image.style.display='inline'; Codehighlighter1_81_548_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />     </span><span id="Codehighlighter1_81_548_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_81_548_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> DISPID_SHOW </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> DISPID_SHOW2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2</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" />     _ATL_FUNC_INFO OnShowInfo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_206_347_Open_Image" onclick="this.style.display='none'; Codehighlighter1_206_347_Open_Text.style.display='none'; Codehighlighter1_206_347_Closed_Image.style.display='inline'; Codehighlighter1_206_347_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_206_347_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_206_347_Closed_Text.style.display='none'; Codehighlighter1_206_347_Open_Image.style.display='inline'; Codehighlighter1_206_347_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span id="Codehighlighter1_206_347_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_206_347_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      CC_STDCALL, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">calling conv<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      VT_EMPTY,</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return value<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ,</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">number of arguments<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      NULL</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">argumnent types<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">     }</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />     _ATL_FUNC_INFO OnShow2Info </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_389_534_Open_Image" onclick="this.style.display='none'; Codehighlighter1_389_534_Open_Text.style.display='none'; Codehighlighter1_389_534_Closed_Image.style.display='inline'; Codehighlighter1_389_534_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_389_534_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_389_534_Closed_Text.style.display='none'; Codehighlighter1_389_534_Open_Image.style.display='inline'; Codehighlighter1_389_534_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span id="Codehighlighter1_389_534_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_534_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      CC_STDCALL, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">calling conv<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      VT_EMPTY,</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return value<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">      </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> ,</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">number of arguments<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_500_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_500_507_Open_Text.style.display='none'; Codehighlighter1_500_507_Closed_Image.style.display='inline'; Codehighlighter1_500_507_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_500_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_500_507_Closed_Text.style.display='none'; Codehighlighter1_500_507_Open_Image.style.display='inline'; Codehighlighter1_500_507_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">      </span><span id="Codehighlighter1_500_507_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_500_507_Open_Text"><span style="COLOR: #000000">{ VT_I2}</span></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">argumnent types<img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">     }</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/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"> CEventSink :  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> IDispEventImpl</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, CEventSink, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">DIID__IAtlTest2Events, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">LIBID_TEST2Lib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_664_1097_Open_Image" onclick="this.style.display='none'; Codehighlighter1_664_1097_Open_Text.style.display='none'; Codehighlighter1_664_1097_Closed_Image.style.display='inline'; Codehighlighter1_664_1097_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_664_1097_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_664_1097_Closed_Text.style.display='none'; Codehighlighter1_664_1097_Open_Image.style.display='inline'; Codehighlighter1_664_1097_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />     </span><span id="Codehighlighter1_664_1097_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_664_1097_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_699_700_Open_Image" onclick="this.style.display='none'; Codehighlighter1_699_700_Open_Text.style.display='none'; Codehighlighter1_699_700_Closed_Image.style.display='inline'; Codehighlighter1_699_700_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_699_700_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_699_700_Closed_Text.style.display='none'; Codehighlighter1_699_700_Open_Image.style.display='inline'; Codehighlighter1_699_700_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />       CEventSink()</span><span id="Codehighlighter1_699_700_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_699_700_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img id="Codehighlighter1_731_732_Open_Image" onclick="this.style.display='none'; Codehighlighter1_731_732_Open_Text.style.display='none'; Codehighlighter1_731_732_Closed_Image.style.display='inline'; Codehighlighter1_731_732_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_731_732_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_731_732_Closed_Text.style.display='none'; Codehighlighter1_731_732_Open_Image.style.display='inline'; Codehighlighter1_731_732_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CEventSink()</span><span id="Codehighlighter1_731_732_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_731_732_Open_Text"><span style="COLOR: #000000">{}</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" />       </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> __stdcall OnShow(); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">没有参数的情况</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">       </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> __stdcall OnShow2(</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">有参数的情况<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" />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">必须要用SINK_ENTRY_INFO,必须指定参数信息</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">       BEGIN_SINK_MAP(CEventSink)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        SINK_ENTRY_INFO(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,DIID_ISimpleCOMEvents,DISPID_SHOW,OnShow,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">OnShowInfo)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        SINK_ENTRY_INFO(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,DIID_ISimpleCOMEvents,DISPID_SHOW2,OnShow2,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">OnShow2Info)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       END_SINK_MAP()<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">#endif</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />方法三：自定义EventSink，从IDispatch派生，实现所有的虚方法,在Invoke函数中根据DISP_ID处理回调 (代码略)<br /><br /><img src ="http://www.cppblog.com/yxm/aggbug/13633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yxm/" target="_blank">yxm</a> 2006-10-13 11:44 <a href="http://www.cppblog.com/yxm/archive/2006/10/13/13633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>