﻿<?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++博客-silekey-文章分类-COM</title><link>http://www.cppblog.com/silekey/category/9024.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 21 Feb 2009 15:48:04 GMT</lastBuildDate><pubDate>Sat, 21 Feb 2009 15:48:04 GMT</pubDate><ttl>60</ttl><item><title>COM术语之我解</title><link>http://www.cppblog.com/silekey/articles/74495.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Sat, 21 Feb 2009 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/74495.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/74495.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/74495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/74495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/74495.html</trackback:ping><description><![CDATA[<p>1&gt;可连接对象&nbsp; ==&gt;拥有回调功能的COM对象<br>2&gt;连接点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; ==&gt;表示回调事件的COM对象<br>3&gt;接收器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ==&gt;处理与响应回调函数的COM对象</p>
<p>4&gt;COM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ==&gt;MIREROSOFE定放的组件标准.<br>5&gt;组件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ==&gt;徘徊在面象过程与面象对象之间的一种开发方式,&nbsp; 最大的优点是二进制上兼容,但又比函数要好。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以理解为面象对象加上限制(不能有成员数据)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C函数库加上函数分类(函数太多,不好管理),这样一种函数就是一个接口.</p>
<br><br>写代码就象写书，东西多了，总得有个目录吧。
<img src ="http://www.cppblog.com/silekey/aggbug/74495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-02-21 11:49 <a href="http://www.cppblog.com/silekey/articles/74495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM对象的跨进程调用</title><link>http://www.cppblog.com/silekey/articles/73124.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Fri, 06 Feb 2009 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/73124.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/73124.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/73124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/73124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/73124.html</trackback:ping><description><![CDATA[<p>如果跨进程调用只是简单的通过TCP把接口 CoMarshalInterface 后再CoUnmarshalInterface的话,<br>会遭遇机器权限的问题. 在同一台机器上没有问题,而在不同的机器上会直接会提示拒绝访问。<br>按网络上的方法在 控制面板里的&lt;组策略&gt; 进行设置未果,还是乖乖的找到了正统的方法：<br><br>而DCOM提供两种方式让COM能够跨机器,<br>1&gt;对象激活,通过远程创建对象来使用.<br>2&gt;对象连接,通过COM的命名与绑定机制来连接COM对象.(与IMoniker接口的实现有关系)</p>
<img src ="http://www.cppblog.com/silekey/aggbug/73124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-02-06 17:26 <a href="http://www.cppblog.com/silekey/articles/73124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在COM中返回字符串</title><link>http://www.cppblog.com/silekey/articles/73055.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Thu, 05 Feb 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/73055.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/73055.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/73055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/73055.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/73055.html</trackback:ping><description><![CDATA[<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">STDMETHODIMP&nbsp;CTestObj::GetName(BSTR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;szName)<br><img id=Codehighlighter1_45_134_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_134_Open_Text.style.display='none'; Codehighlighter1_45_134_Closed_Image.style.display='inline'; Codehighlighter1_45_134_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_45_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_134_Closed_Text.style.display='none'; Codehighlighter1_45_134_Open_Image.style.display='inline'; Codehighlighter1_45_134_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_45_134_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_45_134_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: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;implementation&nbsp;code&nbsp;here</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_szValue.copy();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;S_OK;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>这里面的要点就是在COM与客户端之间 内存分配与释放的问题。<br>上面的代码是懒惰起见的。_bstr_t把这层关系给包了起来。
<img src ="http://www.cppblog.com/silekey/aggbug/73055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-02-05 15:45 <a href="http://www.cppblog.com/silekey/articles/73055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM套间应用心得</title><link>http://www.cppblog.com/silekey/articles/71965.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Wed, 14 Jan 2009 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/71965.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/71965.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/71965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/71965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/71965.html</trackback:ping><description><![CDATA[1.要感受到COM套间的存在,必定会用到列集与散集,即直接或间接的用到CoMarshalInterface CoUnmarshalInterface 这两个函数。<br><br>2.在跨进程与跨机器使用同一个COM对象的最大问题是，如何把列集后的二进制流数据传递出去。<br><br>3.COM把所有细节问题都 转化为:如何获得接口的问题。<br>&nbsp; 我不在乎是否拥有这个对象，我只在乎如何得到操作这个对象的方法。<br><img src ="http://www.cppblog.com/silekey/aggbug/71965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-01-14 09:34 <a href="http://www.cppblog.com/silekey/articles/71965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使ATL对象不能直接被创建(VC7以后的版本)</title><link>http://www.cppblog.com/silekey/articles/71963.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Wed, 14 Jan 2009 01:23:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/71963.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/71963.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/71963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/71963.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/71963.html</trackback:ping><description><![CDATA[转自:http://msdn.microsoft.com/zh-cn/library/4tc639ss(VS.80).aspx<br><br>
<p>可以更改基于 ATL 的 COM 对象的属性，使客户端不能直接创建该对象。这种情况下，将通过另一对象上的方法调用返回对象，而不是直接创建对象。</p>
<h3 class="procedureSubHeading">使对象不可创建</h3>
<ol>
    <li>
    <p>移除对象的 <a  href="http://msdn.microsoft.com/zh-cn/library/exx3wywe%28VS.80%29.aspx" id="ctl00_rs1_mainContentContainer_ctl01" onclick="javascript:Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl01',this);">OBJECT_ENTRY_AUTO</a>。如果希望对象不可创建而控件能注册，则用 <a  href="http://msdn.microsoft.com/zh-cn/library/9dzdxt9z%28VS.80%29.aspx" id="ctl00_rs1_mainContentContainer_ctl02" onclick="javascript:Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl02',this);">OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO</a> 替换 OBJECT_ENTRY_AUTO。</p>
    </li>
    <li>
    <p>在 .idl 文件中向 coclass 添加 <a  href="http://msdn.microsoft.com/zh-cn/library/1s04b1a7%28VS.80%29.aspx" id="ctl00_rs1_mainContentContainer_ctl03" onclick="javascript:Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl03',this);">noncreatable</a> 属性。例如：<br></p>
    </li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[<br>&nbsp;&nbsp;&nbsp;uuid(A1992E3D</span><span style="color: #000000;">-</span><span style="color: #000000;">3CF0</span><span style="color: #000000;">-</span><span style="color: #000000;">11D0</span><span style="color: #000000;">-</span><span style="color: #000000;">826F</span><span style="color: #000000;">-</span><span style="color: #000000;">00A0C90F2851),<br>&nbsp;&nbsp;&nbsp;helpstring(</span><span style="color: #000000;">"</span><span style="color: #000000;">MyObject</span><span style="color: #000000;">"</span><span style="color: #000000;">),<br>&nbsp;&nbsp;noncreatable<br>]<br>coclass&nbsp;MyObject<br>{<br>&nbsp;&nbsp;&nbsp;[</span><span style="color: #0000ff;">default</span><span style="color: #000000;">]&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IMyInterface;<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/silekey/aggbug/71963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-01-14 09:23 <a href="http://www.cppblog.com/silekey/articles/71963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM 使用经验</title><link>http://www.cppblog.com/silekey/articles/71820.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Mon, 12 Jan 2009 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/71820.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/71820.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/71820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/71820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/71820.html</trackback:ping><description><![CDATA[通过实际代码验正:<br>1&gt;COM里面确实存在套间。<br>2&gt;进程内套间的同步防问确实走的是WINDOWS消息机制。<br>3&gt;要是创建COM对象的那个套间被销毁了, 也不会说自动把该COM对象移到主套间中去。<br>&nbsp;&nbsp;&nbsp;&nbsp; 那么其它调用该COM对象的操作都将被阻塞。<br>&nbsp;&nbsp;&nbsp;&nbsp; 即使调用IUnknown接口中的三个基本函数,虽然并不会被阻塞,但内部还是会产生下面类似的异常:<br>&nbsp;&nbsp;&nbsp;&nbsp; (被呼叫方(服务器 [不是服务器应用程序])不可用并已消失。所有连接均无效。没有执行呼叫。)<br>&nbsp;&nbsp;&nbsp;&nbsp;至于MTA套间里的COM对象应该不会出现这个问题,因为MTA套间在程序中只有一个,并且一但创建,<br>&nbsp;&nbsp;&nbsp; 不大可能会被销毁。<br>&nbsp;&nbsp;&nbsp;&nbsp; <br><br><br><br>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>在进程内多个套间使用CoMarshalInterface等函数 共用接口的时候，<br>由CreateStreamOnHGlobal创建的流还是最好用GetHGlobalFromStream来获取其HGLOBAL内存句柄,<br>然后在相应套间中重新创建IStream 。要是&nbsp;CoMarshalInterface 与 CoUnmarshalInterface 都用同一个IStream进行读写的话,<br>会在多于2个套间的情况下产生莫名奇妙的错误。 
<img src ="http://www.cppblog.com/silekey/aggbug/71820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-01-12 17:01 <a href="http://www.cppblog.com/silekey/articles/71820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>COM学习笔记之 --  套间概念</title><link>http://www.cppblog.com/silekey/articles/71786.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Mon, 12 Jan 2009 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/71786.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/71786.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/71786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/71786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/71786.html</trackback:ping><description><![CDATA[套间有两种类型:<br>1&gt;单线程套间 STA<br>2&gt;多线程套间 MTA<br>3&gt;临介区套间 RTA(未来可能会新增)<br><br>其中 单线程套间 在一个进程中可以有多个.<br>而&nbsp;&nbsp; 多线程套间 在一个进程中只能有一个.<br>单线程套间 与相关的线程是1对1的关系.<br>多线程套间 与相关的线程是1对多的关系.<br><br>一般情况下 套间 与 套间之间防问,都需要进行序列化处理.<br>而如果在同一进程下 的 单线程套间 防问多线程套间COM会自动进行优化处理.<br>单线程套间应该有消息循环,去把对它们的调用转成序列化.<br><br><br>在同一进程的情况下:<br>STA是通过把调用转成 消息再由拥有该STA的线程去处理.<br>MTA则是可以直接调用.<br>RTA与STA类似,但它的实现方式是为调用加把锁,然后其它套间调用它的时候就锁住。<br>&nbsp;&nbsp; 与STA不同的是调用在RTA中的对象是发起调用的那个线程,而不是拥有RTA的那个线程。<br><br>在不同进程下:<br>所有调用都会通过 代理\存根 进行序列化处理<br><br>进程外:<br>CoMarshalInterface<br>CoUnmarshalInterface<br><br>CreateStreamOnHGlobal&nbsp;&nbsp;&nbsp;&nbsp; //创建与获取内存流<br>GetHGlobalFromStream<br><br>进程内用的简化函数:<br>CoMarshalInterThreadInterfaceInStream<br>CoGetInterfaceAndReleaseStream<br>声明为Free的COM对象,为什么在本地STA套间中访问会慢些?<br><br>COM把所有细节问题都集结到一个点上:如何正确的获取接口?'<br><br><br>代理接口指针的列集会有问题,因此引入:<br>GIT Global Interface Table<br>IGlobalInterfaceTable<br><img src ="http://www.cppblog.com/silekey/aggbug/71786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2009-01-12 11:03 <a href="http://www.cppblog.com/silekey/articles/71786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>