﻿<?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++博客-一知半解</title><link>http://www.cppblog.com/jzgnh/</link><description>凡事不求甚解，呵呵~~</description><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 05:42:04 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 05:42:04 GMT</pubDate><ttl>60</ttl><item><title>从ATL中调用javascript函数</title><link>http://www.cppblog.com/jzgnh/archive/2009/11/19/101376.html</link><dc:creator>静静的想</dc:creator><author>静静的想</author><pubDate>Thu, 19 Nov 2009 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/jzgnh/archive/2009/11/19/101376.html</guid><wfw:comment>http://www.cppblog.com/jzgnh/comments/101376.html</wfw:comment><comments>http://www.cppblog.com/jzgnh/archive/2009/11/19/101376.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/jzgnh/comments/commentRss/101376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jzgnh/services/trackbacks/101376.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font-family: simsun; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;" class="Apple-style-span">其实做法很简单，就是ATL类中用一个 IDispatch* 来保存javascript函数，在调用时直接调用&nbsp;IDispatch DSPID为0的method即可，简单的示例代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 1002px; font-size: 13px;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">STDMETHODIMP&nbsp;CCallBackScript::put_cbMethod(IDispatch</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;newVal)<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;IDispatch&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(m_callbackmethod)<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDispatch&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m_callbackmethod;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_callbackmethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">Release();<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;newVal;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">AddRef();<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;m_callbackmethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tmp;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;S_OK;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"></span></div>
<br />
这样<span style="font-size: 13px;" class="Apple-style-span">m_callbackmethod中就保存了对应的javascript方法对象。<br />
</span>调用方式如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 1002px; font-size: 13px;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">STDMETHODIMP&nbsp;CCallBackScript::Call(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(m_callbackmethod)<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_com_dispatch_raw_method(m_callbackmethod,</span><span style="color: #000000;">0</span><span style="color: #000000;">,DISPATCH_METHOD,VT_EMPTY,NULL,<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L</span><span style="color: #000000;">"</span><span style="color: #000000;">\x0003\x0008</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">300</span><span style="color: #000000;">,::SysAllocString(L</span><span style="color: #000000;">"</span><span style="color: #000000;">测试中文</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;&nbsp; &nbsp; //其他对应的处理<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;S_OK;<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"></span></div>
<br />
这样就实现了回调函数，至于<span style="font-size: 13px;" class="Apple-style-span">_com_dispatch_raw_method嘛可以看我的另一篇日志 <a class="postTitle2" title="IDispatch 接口方法的调用" href="http://www.cppblog.com/jzgnh/archive/2008/07/23/56987.html" target="_blank">IDispatch 接口方法的调用 ！</a><br />
<br />
使用代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">测试</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">language</span><span style="color: #0000ff;">=javascript</span><span style="color: #0000ff;">&gt;</span><span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #000000;">&lt;!--</span><span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;cbmthod(i,str)&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">i\t=&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">i</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">\nstr\t=&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;str);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">尚不清楚这里抛出异常该如何捕获</span><span style="background-color: #f5f5f5; color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="background-color: #f5f5f5; color: #008000;"></span><span style="background-color: #f5f5f5; color: #000000;">}<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;scrcb&nbsp;;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #0000ff;">try</span><span style="background-color: #f5f5f5; color: #000000;">{<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;scrcb&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">new</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;ActiveXObject(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">TestScriptCallBack.CallBackScript</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">}<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #0000ff;">catch</span><span style="background-color: #f5f5f5; color: #000000;">(e){<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;alert(e.message);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">}<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">scrcb.cbMethod&nbsp;</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;cbmthod;<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;abc(){<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">try</span><span style="background-color: #f5f5f5; color: #000000;">{<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scrcb.Call();<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff;">catch</span><span style="background-color: #f5f5f5; color: #000000;">(e){<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(e.message);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;">}<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"><br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="background-color: #f5f5f5; color: #000000;"></span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">--&gt;</span><span style="background-color: #f5f5f5; color: #008000;"><br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="background-color: #f5f5f5; color: #008000;"></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">=button&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=点击测试&nbsp;</span><span style="color: #ff0000;">onclick</span><span style="color: #0000ff;">="abc()"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
</span></span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font-family: simsun; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;" class="Apple-style-span"><span style="font-size: 13px;" class="Apple-style-span">当然在多线程中不这么方便，需要 </span></span><span style="color: #7b68ff; font-weight: bold;">CoMarshalInterface</span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font-family: simsun; font-style: normal; font-variant: normal; font-weight: bold; font-size: medium; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; white-space: normal; orphans: 2; letter-spacing: normal; color: #7b68ff; word-spacing: 0px;" class="Apple-style-span"><span style="font-size: 13px;" class="Apple-style-span"> </span></span><span style="color: #7b68ff; font-weight: bold;">CoUnmarshalInterface</span><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font-family: simsun; font-style: normal; font-variant: normal; font-weight: normal; font-size: medium; line-height: normal; font-size-adjust: none; font-stretch: normal; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px;" class="Apple-style-span"><span style="font-size: 13px;" class="Apple-style-span"> 来协助完成！<br />
</span></span>&nbsp;<br />
<div><span style="color: red; "><strong>这里写了一个</strong></span>&nbsp;<a href="/Files/jzgnh/asyncall.7z" title="例子">例子</a><span style="color: red; "><strong>，可以看看</strong></span>&nbsp;</div>
<span style="border-collapse: separate; font-family: simsun; font-size: medium; line-height: normal; " class="Apple-style-span"><span style="font-size: 13px;" class="Apple-style-span"><br />
别处摘抄：<br />
<span style="color: red;">说明<br />
该技术仅适用于脚本。不适合于VB、C++客户。<br />
该技术和连接点、事件无关。<br />
</span><br />
</span></span>
<img src ="http://www.cppblog.com/jzgnh/aggbug/101376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jzgnh/" target="_blank">静静的想</a> 2009-11-19 13:49 <a href="http://www.cppblog.com/jzgnh/archive/2009/11/19/101376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc++ 中的 属性</title><link>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html</link><dc:creator>静静的想</dc:creator><author>静静的想</author><pubDate>Fri, 25 Jul 2008 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html</guid><wfw:comment>http://www.cppblog.com/jzgnh/comments/57142.html</wfw:comment><comments>http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jzgnh/comments/commentRss/57142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jzgnh/services/trackbacks/57142.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp; 在vb、c#、javascript这些脚本语言中都有属性这个东西，使用起来相当方便，甚至在COM中也有属性这一说。可偏偏在C++中没有这个，在实现COM的时候使用的是虚函数表，归根揭底COM的属性是使用C++函数来实现的，所以在我们调用的时候总没有个方便的方法来使用属性。不过属性确实是使用起来方便，最起码是书写起来方便。 <br><br>&nbsp;&nbsp;&nbsp; 可能是为了和VB和C#统一吧，所以微软在C++的扩展里面也提供了属性这个东西，跟vb 和c#很相似（对象的属性<strong>&nbsp; </strong>property ，不是[]属性attribute 啊），其实就是微软自己的扩展（Microsoft-Specific，不知道如何翻译，微软特有？），所以其他的编译器可是不支持的哦。呵呵~说了一大堆废话，其实就是说在vc++(<span style="color: red;">VC6中有</span><sup>[1]</sup>,VC2005中有,相信VC2008中也有)中添加了一个新的关键字__declspec(property)) 。下面就介绍下这个关键字的用法。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; [1] 原来没有vc6 环境,没测试,看看文档以为没有呢,其实vc6也支持,今天刚测试了,赶快更正~<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emembarrassed.gif" align="absmiddle" border="0"><br>&nbsp;<br>在MSND 中的说明为(http://msdn.microsoft.com/en-us/library/yhfk0thd(VS.80).aspx ):
<p><strong>
<pre class="libCScode" id="ctl00_rs1_mainContentContainer_ctl05other" space="preserve"><strong>__declspec(</strong>property({<strong>get=</strong><em>get_func_name</em>|<strong>,put=</strong><em>put_func_name</em>}<strong>))<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><strong><strong>__declspec(&nbsp;property(&nbsp;</strong></strong></span><span style="color: #0000ff;"><strong><strong>get</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>get_func_name&nbsp;)&nbsp;)&nbsp;declarator<br>__declspec(&nbsp;property(&nbsp;put</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>put_func_name&nbsp;)&nbsp;)&nbsp;declarator<br>__declspec(&nbsp;property(&nbsp;</strong></strong></span><span style="color: #0000ff;"><strong><strong>get</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>get_func_name,&nbsp;put</strong></strong></span><span style="color: #000000;"><strong><strong>=</strong></strong></span><span style="color: #000000;"><strong><strong>put_func_name&nbsp;)&nbsp;)&nbsp;declarator</strong></strong></span></div>
</strong><strong><strong><strong><strong style="font-weight: normal;">,这个变量不占用内存,只是个名字而</strong></strong><strong style="font-weight: normal;"> </strong></strong></strong><span style="font-weight: normal;">    如何使用呢?先看人家微软给的例子:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;declspec_property.cpp</span></strong><span style="color: #008000;"><br></span><strong><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span></strong><strong><span style="color: #000000;">&nbsp;S&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;i;<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;putprop(</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;j)&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span></strong><strong><span style="color: #000000;">&nbsp;j;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;</strong><span style="color: #000000;"><br></span><strong><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;getprop()&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span></strong><strong><span style="color: #000000;">&nbsp;i;<br></span><span style="color: #008080;">10</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;</strong><span style="color: #000000;"><br></span><strong><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;__declspec(property(</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getprop,&nbsp;put&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;putprop))&nbsp;</span><span style="color: #0000ff;">int</span></strong><strong><span style="color: #000000;">&nbsp;the_prop;<br></span><span style="color: #008080;">13</span>&nbsp;</strong><strong><span style="color: #000000;">};<br></span><span style="color: #008080;">14</span>&nbsp;</strong><span><br><strong>15</strong></span><strong>&nbsp;<span style="color: #000000;"></span></strong><strong><span>int&nbsp;main()&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;</strong><strong><span style="color: #000000;">&nbsp;&nbsp;&nbsp;S&nbsp;s;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;s.the_prop&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span></strong><span><strong>5;</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这里其实就是调用的putprop方法<br><strong>18</strong></span><strong>&nbsp;</strong><span><strong>&nbsp;&nbsp;&nbsp;return&nbsp;s.the_prop;</strong>&nbsp;&nbsp; //而这里调用的就是getprop方法了<br></span><strong><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">}</span></strong></div>
<br>   很简单吧~,msdn上的描述是英文的,俺就不翻译了,英文水平很次,大意是编译器把这个声明当成一个虚拟数<br>据变量(<strong style="font-weight: normal;">virtual data members, 俺就直接说属性更容易理解),这个其实只是个符号，在编写代码的时候当成<br>属性来对待，编译的时候编译器会把此属性对应到相应的函数调用,其实还是C++本身的函数调用,只是书写上的<br>方便,不过如果只是在Windows上的开发,这个也省事不少啊。<br> <br>   如果声明成只读属性那么只要指定get就行，同理只写属性只要指定put就可以了~ <br> <br><br><br>   简单的属性例子就是这样了，MSDN上貌似介绍的不够详细，如果我们的属性是数组如何对待呢？多维数组呢？ <br><br><br> <br>   其实数组也是一样的，只是数组需要有参数来传递他的下标，还有个好消息要说的是，这个下标可不仅仅是简<br>单的整形变量了，只要你想写什么类型的都可以，呵呵~~在COM编程时如果使用了#import 来引入的类库信息，<br>生成的代码里很多数组就是使用了_variant_t类型哦~，二维或者多维数组呢只是多了几个参数而已，很简单，<br>不过使用属性的时候一定要是 s.prop[i][j],必须要用数组的形式调用才会映射正确所需要调用的函数啊，否则<br>会报错滴，俺经常犯的错就是使用了()，失误~~<br><br> <br>   代码其实就也是一样的了，只是在方法中多传递几个参数而已，这里没环境，代码如下:<br>
<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: #008080;"><strong><strong>&nbsp;1</strong></strong></span><strong><strong>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;declspec_property.cpp</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;S&nbsp;{<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;putprop(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;var)&nbsp;{&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i[index]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;var;<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getprop(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;index)&nbsp;{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;i[index];<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;__declspec(property(</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getprop,&nbsp;put&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;putprop))&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;the_prop[];<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()&nbsp;{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;s;<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;s.the_prop[</span><span style="color: #000000;">3</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;s.the_prop[</span><span style="color: #000000;">3</span><span style="color: #000000;">];&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">}</span></strong></strong></div>
<br> <br>   算是写完了，呵呵~~这个比较简单~~   <br></strong></span><br>  </pre>
</strong>
</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/jzgnh/aggbug/57142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jzgnh/" target="_blank">静静的想</a> 2008-07-25 15:04 <a href="http://www.cppblog.com/jzgnh/archive/2008/07/25/57142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IDispatch 接口方法的调用</title><link>http://www.cppblog.com/jzgnh/archive/2008/07/23/56987.html</link><dc:creator>静静的想</dc:creator><author>静静的想</author><pubDate>Wed, 23 Jul 2008 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/jzgnh/archive/2008/07/23/56987.html</guid><wfw:comment>http://www.cppblog.com/jzgnh/comments/56987.html</wfw:comment><comments>http://www.cppblog.com/jzgnh/archive/2008/07/23/56987.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/jzgnh/comments/commentRss/56987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jzgnh/services/trackbacks/56987.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在COM开发中免不了要使用 IDispatch 接口,这个接口在脚本中对应的就是 Object 对象(哪个脚本? 当然是可以使用COM的脚本了,VBS,JS,VB.NET,C#总之很多了),经常在调用一个对象的方法或者使用他的属性的时候最容易的方法就是确切的得到这个对象的接口,这样调用起来方便多了,效率也好. 但是天不遂人愿啊,经常有些情况下不方便或者根本就得不到确定的接口,不得已啊只好硬着头皮写 IDispatch::GetIDsOfNames IDispatch::Invoke ,不仅写起来麻烦,连传参数都要注意,这个是从右到左传,最恐怖的恐怕还是"千万别内存泄露了",苦恼啊~~<br><br>&nbsp;&nbsp;&nbsp; 话说俺这次又要用到"可爱"的IDispatch接口了,是可以通过引入类型库来得到确定的接口类型,可是就因为这么一个函数调用引入类型库太夸张了,算了还是IDispatch::Invoke吧. 不过这个也确实有点麻烦,有没有个简单点的方法呢? 嘿嘿~~皇天不负有心人啊,终于让俺找到了,在excel上编写插件来操作excel时需要引入excel的类型库,这个excel有点不厚道设计的时候那些可以方便调用的方法都是在 I***&nbsp;&nbsp;中,这些个接口俺是没搞清楚如何能得到,但是如果你在&nbsp;&nbsp;#import 中没有使用 raw_interfaces_only 选项,那在程序中调用也是相当方便的啊,方便到跟写脚本都没分别的地步了,爽啊,看他如何实现的吧~~ 打开 excel.tli 文件(这个家伙个头很大),发现很多调用并没有使用俺很熟悉的 raw_&lt;Method&gt; 的形式,这些个应该就是通过IDispatch接口来调用的了,随便拿一个吧~<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"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;implementation_key(</span><span style="COLOR: #000000">263</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_100_207_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_207_Open_Text.style.display='none'; Codehighlighter1_100_207_Closed_Image.style.display='inline'; Codehighlighter1_100_207_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_100_207_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_207_Closed_Text.style.display='none'; Codehighlighter1_100_207_Open_Image.style.display='inline'; Codehighlighter1_100_207_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>inline&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Excel::Font::PutBackground&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;_variant_t&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;_arg1&nbsp;)&nbsp;</span><span id=Codehighlighter1_100_207_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_100_207_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_method(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0xb4</span><span style="COLOR: #000000">,&nbsp;DISPATCH_PROPERTYPUT,&nbsp;VT_EMPTY,&nbsp;NULL,&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\x000c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">_arg1);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
&nbsp;&nbsp;&nbsp; 应该想到了吧,他就是使用 _com_dispatch_method 这个东西来调用的.OK,上网找点资料~可惜失望啊,网上对这个的描述竟然——没找到，囧<img style="WIDTH: 20px; HEIGHT: 20px" height=20 src="http://www.cppblog.com/Emoticons/QQ/02.gif" width=20 border=0>(这哥俩长的挺像<img height=20 src="http://www.cppblog.com/Emoticons/QQ/14.gif" width=20 border=0><wbr>)~~不过还是有个地方有点描述,上网址:http://support.microsoft.com/kb/178845&nbsp;&nbsp;先看看这里对这个函数的描述:<br><font color=#ff0000>示例代码显示无出处函数 _com_dispatch_method(), 它是的 C 运行时库函数调用。 作为备用方案, IDispatch:: Invoke 不使用该 Helper 函数直接调用。<wbr></font> (这个是人家微软机器翻译的,可以通过上面的网址转成英文的看原文,俺就不粘了)<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"><span style="COLOR: #000000">HRESULT&nbsp;_&nbsp;_&nbsp;cdecl&nbsp;_com_dispatch_method(IDispatch&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDisp,&nbsp;DISPID&nbsp;dispid,&nbsp;WORD&nbsp;w,&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;&nbsp;&nbsp;VARTYPE&nbsp;vt,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pResult,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;szFormat,&nbsp;...);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;pDisp&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;IDispatch&nbsp;of&nbsp;the&nbsp;method</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">s&nbsp;object.</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;dispid&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;The&nbsp;DISPID&nbsp;of&nbsp;the&nbsp;method&nbsp;to&nbsp;call.<br>&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;Always&nbsp;DISPATCH_METHOD.<br>&nbsp;&nbsp;&nbsp;vt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;The&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;type.&nbsp;Must&nbsp;be&nbsp;a&nbsp;Variant&nbsp;type.<br>&nbsp;&nbsp;&nbsp;pResult&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;Pointer&nbsp;to&nbsp;the&nbsp;memory&nbsp;location&nbsp;to&nbsp;place&nbsp;the&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value.<br>&nbsp;&nbsp;&nbsp;SzFormat&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;String&nbsp;where&nbsp;each&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">&nbsp;represents&nbsp;the&nbsp;variant&nbsp;type&nbsp;of&nbsp;each<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;arguments&nbsp;being&nbsp;passed&nbsp;to&nbsp;the&nbsp;method.</span></div>
这个描述确实是不详细,还是看看人家excel如何使用的吧~~&nbsp;&nbsp;经过俺对里面n多函数的研究(就当是研究吧,显得高深)后,终于大概明白了这个函数的用法.<br>其实跟他一起的哥们还有几个,在comdef.h 文件中定义的,定义如下:<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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">HRESULT&nbsp;__stdcall<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_propget(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;VARTYPE,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;__cdecl<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_propput(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;VARTYPE,&nbsp;...)&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;__cdecl<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_method(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;WORD,&nbsp;VARTYPE,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;...)&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;__stdcall<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_raw_propget(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;VARTYPE,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">();<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;__cdecl<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_raw_propput(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;VARTYPE,&nbsp;...)&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">();<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HRESULT&nbsp;__cdecl<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_com_dispatch_raw_method(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;WORD,&nbsp;VARTYPE,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;...)&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">();<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>下面的三个带_raw_的方法还没搞清楚是干嘛的,所以先忽略,猜测貌似除了不抛出异常外跟上面的一样.<br>上面三个通过名字大概可以看出来了吧,_com_dispatch_propget 取IDispatch属性 ,_com_dispatch_propput 设置IDispatch属性,_com_dispatch_method 调用方法,其实前两个我就直接把他当成设置了几个参数的_com_dispatch_method 方法了,因为属性的操作在_com_dispatch_method中都可以做.下面看看如何使用这三个函数吧~<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"><span style="COLOR: #000000">HRESULT&nbsp;__stdcall&nbsp;&nbsp;&nbsp;_com_dispatch_propget(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">,&nbsp;DISPID,&nbsp;VARTYPE,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;;</span></div>
这个是取属性用的,参数依次为: <br>要操作的接口指针;<br>操作的属性或者方法的编号,就是*.idl中方法或者属性前面的 id 属性,也可以通过GetIDsOfNames 来得到;<br>属性的类型,这个必须是已经分配空间的Variant中支持的类型;<br>用来接受结果的指针,已经分配内存的哦~~<br><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"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #008000">//<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;_result;<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000">_com_dispatch_propget(pDisp,</span><span style="COLOR: #000000">0x02</span><span style="COLOR: #000000">,VT_I4,(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">_result);<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这时_result就存储了要得到的结果值<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">别忘了捕获异常,否则程序可能会当掉的哦~~</span>&nbsp;<span style="COLOR: #008000"></span></div>
下面的_com_dispatch_propput应该跟上面一样(猜测,没用过),就不写了.<br>主要说下 _com_dispatch_method 方法吧.<br>上面有个简要的介绍他的相关参数了,不过我还是再描述一遍吧(装个高手<img height=20 src="http://www.cppblog.com/Emoticons/QQ/13.gif" width=20 border=0><wbr>)<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"><span style="COLOR: #000000">HRESULT&nbsp;_&nbsp;_&nbsp;cdecl&nbsp;_com_dispatch_method(IDispatch&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDisp,&nbsp;DISPID&nbsp;dispid,&nbsp;WORD&nbsp;w,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VARTYPE&nbsp;vt,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pResult,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;szFormat,&nbsp;...);&nbsp;<br><br>&nbsp;&nbsp;&nbsp;pDisp&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;IDispatch&nbsp;指针.&nbsp;&nbsp;&nbsp;dispid&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;要调用的方法的&nbsp;DISPID&nbsp;.<br>&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;有几个取值,如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_METHOD&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;表示是调用方法,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_PROPERTYGET&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;取属性,跟第一个方法一样,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_PROPERTYPUT&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;设置属性,跟第二个方法一样,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DISPATCH_PROPERTYPUTREF&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;设置属性,为带有BY_REF标志位的属性(没用过).<br>&nbsp;&nbsp;&nbsp;vt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;方法返回值,或者取属性的返回值,必须是&nbsp;VARIANT&nbsp;能容纳的类型(VT_</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当为VT_EMPTY&nbsp;时表示无返回值,pResult应该传递NULL.&nbsp;<br>&nbsp;&nbsp;&nbsp;pResult&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;同样是分配好用来存放返回值内存的的地址.<br>&nbsp;&nbsp;&nbsp;szFormat&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;指示后面 ... 所要传递的参数,这个下面详细介绍.<br>&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;用来向方法传递的参数,如果szFormat为NULL,则这个不需要传递.<br></span></div>
szFormat参数<br>&nbsp;&nbsp;这个参数为wchar_t的指针,此指针用来判断要传递的参数的类型和数目,在常见调用中是如下形式:<br>&nbsp;&nbsp;&nbsp;&nbsp; "\x000b\x080c\x400b" 形如这样的字符串,因为wchar_t是16位的数据,在其中 低八位表示参数的类型,跟VARTYPE定义的类型一致,如 VT_I4 就是 0x03, 例子中的 \x000b 就表示是 VT_BOOL 类型,如果是表示VT_BYREFF方式传递的话,需要与VT_BYREF 相活 即 VT_BOOL | VT_BYREF (\x400b),此时的参数应该传递VARIANT_BOOL *类型,szFormat中每个非NULL字符表示一个参数,有字符串有多长就表示有多少个参数,其中的\x080c 根据规律来看应该表示是可选参数,即如果在idl中定义时有 option 属性的参数需要 设置此标志位,如 VT_VARIANT | 0x0800 即 \x080c . <br>这样后面的... 就应该传递相应的参数,否则肯定会破坏函数的堆栈,跟调用printf应该是一样了,这个没找到文档,不过猜测如果有文档肯定要写上,如果szFormat参数描述的参数跟实际传递的参数不一样那么将是未定义行为,呵呵<img height=20 src="http://www.cppblog.com/Emoticons/QQ/13.gif" width=20 border=0><wbr>~~<br>好了,说了半天发现没几个有用的句子,干脆再来个例子收尾吧~~<br><br>在idl中方法的定义如下:<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"><span style="COLOR: #000000">[id(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">),&nbsp;helpstring(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">方法BindPic</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]&nbsp;HRESULT&nbsp;BindPic([</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">]&nbsp;IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pic);</span></div>
C++类中的声明:<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"><span style="COLOR: #000000">STDMETHOD(BindPic)(IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pic);</span></div>
调用方式:<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_dispatch_method((LPDISPATCH)pDisObj,</span><span style="COLOR: #000000">0x01</span><span style="COLOR: #000000">,DISPATCH_METHOD,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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;&nbsp;&nbsp;&nbsp;VT_EMPTY,NULL,L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\x0009</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,(LPDISPATCH)pic);</span></div>
<br>例子写的简单了点,呵呵~~ 不明白就留言吧<img height=20 src="http://www.cppblog.com/Emoticons/QQ/14.gif" width=20 border=0>~<br>
<img src ="http://www.cppblog.com/jzgnh/aggbug/56987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jzgnh/" target="_blank">静静的想</a> 2008-07-23 20:38 <a href="http://www.cppblog.com/jzgnh/archive/2008/07/23/56987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>