﻿<?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++博客-DirectX3D 学习-随笔分类-DirectX</title><link>http://www.cppblog.com/xpcer/category/8264.html</link><description>学习DirectX3D</description><language>zh-cn</language><lastBuildDate>Wed, 19 Nov 2008 17:53:13 GMT</lastBuildDate><pubDate>Wed, 19 Nov 2008 17:53:13 GMT</pubDate><ttl>60</ttl><item><title>转贴  3D游戏好书</title><link>http://www.cppblog.com/xpcer/archive/2008/11/19/67269.html</link><dc:creator>xpcer</dc:creator><author>xpcer</author><pubDate>Wed, 19 Nov 2008 04:55:00 GMT</pubDate><guid>http://www.cppblog.com/xpcer/archive/2008/11/19/67269.html</guid><wfw:comment>http://www.cppblog.com/xpcer/comments/67269.html</wfw:comment><comments>http://www.cppblog.com/xpcer/archive/2008/11/19/67269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpcer/comments/commentRss/67269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpcer/services/trackbacks/67269.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: function replace_date(d){var da = d.split(' ');day = ""+da[2].replace(/,/,"")+""; // 12month = ""+da[1].slice(0,3)+""; // Decemberdocument.write(day+month);}T...&nbsp;&nbsp;<a href='http://www.cppblog.com/xpcer/archive/2008/11/19/67269.html'>阅读全文</a><img src ="http://www.cppblog.com/xpcer/aggbug/67269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpcer/" target="_blank">xpcer</a> 2008-11-19 12:55 <a href="http://www.cppblog.com/xpcer/archive/2008/11/19/67269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载  智能指针CComPtr 和 CComQIPtr</title><link>http://www.cppblog.com/xpcer/archive/2008/11/17/67145.html</link><dc:creator>xpcer</dc:creator><author>xpcer</author><pubDate>Mon, 17 Nov 2008 14:08:00 GMT</pubDate><guid>http://www.cppblog.com/xpcer/archive/2008/11/17/67145.html</guid><wfw:comment>http://www.cppblog.com/xpcer/comments/67145.html</wfw:comment><comments>http://www.cppblog.com/xpcer/archive/2008/11/17/67145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpcer/comments/commentRss/67145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpcer/services/trackbacks/67145.html</trackback:ping><description><![CDATA[<font size=4><font face="Times New Roman"><span>ATL </span></font><span>提供了</span><span><font face="Times New Roman">2</font></span><span>个智能指针的模板包装类，</span><span><font face="Times New Roman">CComPtr&lt;&gt; </font></span><span>和</span><span><font face="Times New Roman"> CComQIPtr&lt;&gt;</font></span><span>，这两个类都在</span><span><font face="Times New Roman"> &lt;atlbase.h&gt; </font></span><span>中声明。</span><span><font face="Times New Roman">CComQIPtr&lt;&gt; </font></span><span>包含了</span><span><font face="Times New Roman"> CComPtr&lt;&gt;</font></span><span>的所有功能，因此我们可以完全用</span><span><font face="Times New Roman"> CComQIPtr&lt;&gt; </font></span><span>来使用智能接口指针，唯一要说明的一点就是：</span><span><font face="Times New Roman">CComQIPtr&lt;&gt; </font></span><span>由于使用了运算符的重载功能，它会自动帮我们调用</span><span><font face="Times New Roman">QueryInterface()</font></span><span>函数，因此</span><span><font face="Times New Roman"> CComQIPtr&lt;&gt; </font></span><span>唯一的缺点就是不能定义</span><span><font face="Times New Roman"> IUnknown * </font></span><span>指针。</span></font>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>智能指针</span><span><font face="Times New Roman"> smart pointer</font></span><span>，按照匈牙利命名法，一般以</span><span><font face="Times New Roman"> sp </font></span><span>开头来表示变量类型</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComPtr &lt; IUnknown &gt; spUnk;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>正确</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>假设</span><span><font face="Times New Roman"> IFun </font></span><span>是一个接口类型</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComPtr &lt; IFun &gt; spFun;<span> </span>// </font></span><span>正确</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun;<span>&nbsp;&nbsp;&nbsp; </span>// </font></span><span>正确</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun, &amp;IID_IFun &gt; spFun;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>正确</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IUnknown &gt; spUnk;<span>&nbsp;&nbsp; </span>// </font></span><span>错误！</span><span><font face="Times New Roman">CComQIPtr</font></span><span>不能定义</span><span><font face="Times New Roman">IUnknown</font></span><span>指针</span></font></p>
<p><font size=4><span>　　给智能指针赋值的方法：</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun;<span>&nbsp;&nbsp;&nbsp; </span>// </font></span><span>调用构造函数，还没有赋值，被包装的内部接口指针为</span><span><font face="Times New Roman"> NULL</font></span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun( pOtherInterface );<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>调用构造函数，内部接口指针赋值为</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>通过</span><span><font face="Times New Roman"> pOtherInterface </font></span><span>这个普通接口指针调用</span><span><font face="Times New Roman">QueryInterface()</font></span><span>得到的</span><span><font face="Times New Roman">IFun</font></span><span>接口指针</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun( spOtherInterface ); // </font></span><span>调用构造函数，内部接口指针赋值为</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>通过</span><span><font face="Times New Roman"> spOtherInterface </font></span><span>这个只能接口指针调用</span><span><font face="Times New Roman">QueryInterface()</font></span><span>得到的</span><span><font face="Times New Roman">IFun</font></span><span>接口指针</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun ( pUnknown );<span>&nbsp;&nbsp;&nbsp; </span>// </font></span><span>调用构造函数，由</span><span><font face="Times New Roman">IUnknown</font></span><span>的</span><span><font face="Times New Roman">QueryInterface()</font></span><span>得到</span><span><font face="Times New Roman">IFun</font></span><span>接口指针</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;CComQIPtr &lt; IFun &gt; spFun = pOtherInterface;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// = </font></span><span>运算符重载，含义和上面一样</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun = spOtherInterface;<span> </span>// </font></span><span>同上</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun = pUnknown;&nbsp;// </font></span><span>同上</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;pUnknown-&gt;QueryInterface( IID_IFun, &amp;sp );<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>也可以通过</span><span><font face="Times New Roman">QueryInterface</font></span><span>赋值</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>智能指针赋值后，可以用条件语句判断是否合法有效</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;if ( spFun ){}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>如果指针有效</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;if ( NULL != spFun ){}<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>如果指针有效</span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;if ( !spFun ){}<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>如果指针无效</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;if ( NULL == spFun ){}<span>&nbsp;&nbsp;&nbsp; </span>// </font></span><span>如果指针无效</span></font></p>
<p><font size=4><span>　　智能指针调用函数的方法：</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun.CoCreateInstance(...);<span>&nbsp;&nbsp;&nbsp; </span>// </font></span><span>等价与</span><span><font face="Times New Roman"> API </font></span><span>函数</span><span><font face="Times New Roman">::CoCreateInstance(...)</font></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun.QueryInterface(...);<span> </span>// </font></span><span>等价与</span><span><font face="Times New Roman"> API </font></span><span>函数</span><span><font face="Times New Roman">::QueryInterface()</font></span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun-&gt;Add(...);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>调用内部接口指针的接口函数</span></font></p>
<p><font size=4><span><font face="Times New Roman">&nbsp;</font></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;// </font></span><span>调用内部接口指针的</span><span><font face="Times New Roman">QueryInterface()</font></span><span>函数，其实效果和</span><span><font face="Times New Roman"> spFun.QueryInterface(...) </font></span><span>一样</span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun-&gt;QueryInterface(...);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></font></p>
<p><font size=4><span>　　</span><span><span><font face="Times New Roman">&nbsp; </font></span></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun.Release();<span> </span>// </font></span><span>释放内部的接口指针，同时内部指针赋值为</span><span><font face="Times New Roman"> NULL</font></span></font></p>
<p><font size=4><span>　　</span><span><font face="Times New Roman">&nbsp;spFun-&gt;Release();<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>错！！！一定不要这么使用。</span></font></p>
<p><font size=4><span>　　</span><span>&nbsp;// </span><span>因为这个调用并不把内部指针清空，那么析构的时候会被再次释放（释放了两次）</span></font></p>
<p><font size=4></font></p>
<h1><font size=4><span></font><span><font size=4><span>2 </span></font><span><span><span>使用智能指针</span></span></span></span></h1>
<p><span>使用智能指针的好处是不需要我们去显示的释放接口指针</span></p>
<p><span>首先要加载</span><span>atlbase.h</span><span>文件</span></p>
<p><span>＃i nclude &#8220;atlbase.h&#8221;</span></p>
<p><span>＃i nclude &#8220;xxx.h&#8221;</span></p>
<p><span>＃i nclude &#8220;xxx_i.c&#8221;</span></p>
<p><span>&nbsp;</span></p>
<p align=left><span><span>CComPtr</span><span>&lt;</span><span>IUnknown</span><span>&gt;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>pIUnknown</span><span>;&nbsp;</span><span>// </span></span><span>定义</span><span> IUnknown </span><span>的智能指针</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CComPtr</span><span>&lt;</span><span>IObj1</span><span>&gt;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>pObj1</span><span>;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>// </span></span><span>定义</span><span> IObj1 </span><span>的智能指针</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>HRESULT</span><span> </span><span>hr</span><span>;</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>try</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>//</span></span><span>可以用</span><span>CLSID,</span><span>也可以用</span><span>PROGID</span><span>启动组件</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>hr</span><span> = </span><span>pIUnknown</span><span>.</span><span>CoCreateInstance</span><span>(</span><span>CLSID_Obj1</span><span>);</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span>(</span><span>FAILED</span><span>(</span><span>hr</span><span>))</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>throw</span><span>(</span><span>_T</span><span>(</span><span>"</span></span><span>启动组件出错</span><span><span>"</span><span>));</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>hr</span><span> = </span><span>pIUnknown</span><span>.</span><span>QueryInterface</span><span>(&amp;</span><span>pObj1</span><span>);</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span>(</span><span>FAILED</span><span>(</span><span>hr</span><span>))</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>throw</span><span>(</span><span>_T</span><span>(</span><span>"Query</span></span><span>接口错误</span><span><span>"</span><span>));</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>long</span><span> </span><span>pVal</span><span>;</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>hr</span><span> = </span><span>pObj1</span><span>-&gt;</span><span>add</span><span>(147,258,&amp;</span><span>pVal</span><span>);</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span>(</span><span>FALSE</span><span>(</span><span>hr</span><span>))</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>throw</span><span>(</span><span>_T</span><span>(</span><span>"</span></span><span>加载函数出错</span><span><span>"</span><span>));</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CString</span><span> </span><span>sMsg</span><span>;</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>sMsg</span><span>.</span><span>Format</span><span>( </span><span>_T</span><span>(</span><span>"147 + 258 = %ld"</span><span>), </span><span>pVal</span><span> );</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>AfxMessageBox</span><span>( </span><span>sMsg</span><span> );</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>catch</span><span> (</span><span>LPCTSTR</span><span> </span><span>lpstr</span><span>)</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>AfxMessageBox</span><span>(</span><span>lpstr</span><span>);</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<h1><span>3&nbsp;&nbsp;&nbsp; </span><span><span><span>CComPtr</span><span>的代码</span></span></span></h1>
<span>
<p align=left><span><span>template</span><span> &lt;</span><span>class</span><span> </span><span>T</span><span>&gt;</span></span></p>
<p align=left><span><span>class</span><span> </span><span>CComPtr</span></span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>public</span><span>:</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>typedef</span><span> </span><span>T</span><span> </span><span>_PtrClass</span><span>;</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CComPtr</span><span>()</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>p</span><span>=</span><span>NULL</span><span>;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CComPtr</span><span>(</span><span>T</span><span>* </span><span>lp</span><span>)</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span> ((</span><span>p</span><span> = </span><span>lp</span><span>) != </span><span>NULL</span><span>)</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>p</span><span>-&gt;</span><span>AddRef</span><span>();</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>CComPtr</span><span>(</span><span>const</span><span> </span><span>CComPtr</span><span>&lt;</span><span>T</span><span>&gt;&amp; </span><span>lp</span><span>)</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span> ((</span><span>p</span><span> = </span><span>lp</span><span>.</span><span>p</span><span>) != </span><span>NULL</span><span>)</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>p</span><span>-&gt;</span><span>AddRef</span><span>();</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~</span><span>CComPtr</span><span>()</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span> (</span><span>p</span><span>)</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>p</span><span>-&gt;</span><span>Release</span><span>();</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>void</span><span> </span><span>Release</span><span>()</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>IUnknown</span><span>* </span><span>pTemp</span><span> = </span><span>p</span><span>;</span></span></p>
<p align=left><span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>if</span><span> (</span><span>pTemp</span><span>)</span></span></p>
&lt;</span></span>
<img src ="http://www.cppblog.com/xpcer/aggbug/67145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpcer/" target="_blank">xpcer</a> 2008-11-17 22:08 <a href="http://www.cppblog.com/xpcer/archive/2008/11/17/67145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>d3d中保存屏幕</title><link>http://www.cppblog.com/xpcer/archive/2008/09/17/62093.html</link><dc:creator>xpcer</dc:creator><author>xpcer</author><pubDate>Wed, 17 Sep 2008 11:29:00 GMT</pubDate><guid>http://www.cppblog.com/xpcer/archive/2008/09/17/62093.html</guid><wfw:comment>http://www.cppblog.com/xpcer/comments/62093.html</wfw:comment><comments>http://www.cppblog.com/xpcer/archive/2008/09/17/62093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpcer/comments/commentRss/62093.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpcer/services/trackbacks/62093.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">LPDIRECT3DSURFACE9&nbsp;ScreenShotSurface;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(GetKeyState(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x80</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;GetKeyState(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x80</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_92_441_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_441_Open_Text.style.display='none'; Codehighlighter1_92_441_Closed_Image.style.display='inline'; Codehighlighter1_92_441_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_92_441_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_441_Closed_Text.style.display='none'; Codehighlighter1_92_441_Open_Image.style.display='inline'; Codehighlighter1_92_441_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_92_441_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_92_441_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DDISPLAYMODE&nbsp;d3dm;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetDisplayMode(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">d3dm);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateOffscreenPlainSurface(d3dm.Width,d3dm.Height,d3dm.Format,D3DPOOL_DEFAULT,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ScreenShotSurface,&nbsp;NULL);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g_pD3DDevice</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetBackBuffer(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,D3DBACKBUFFER_TYPE_MONO,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ScreenShotSurface);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D3DXSaveSurfaceToFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">save.bmp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,D3DXIFF_BMP,ScreenShotSurface,NULL,NULL);<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>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.cppblog.com/xpcer/aggbug/62093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpcer/" target="_blank">xpcer</a> 2008-09-17 19:29 <a href="http://www.cppblog.com/xpcer/archive/2008/09/17/62093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>