﻿<?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>IT博客-老马侠客-文章分类-C++</title><link>http://www.cnitblog.com/mashang/category/6677.html</link><description>   江湖心中谱，人生脚下路 。




   老马知识途，三思不停步 ……</description><language>zh-cn</language><lastBuildDate>Sun, 02 Oct 2011 10:58:29 GMT</lastBuildDate><pubDate>Sun, 02 Oct 2011 10:58:29 GMT</pubDate><ttl>60</ttl><item><title>c++ delegate</title><link>http://www.cnitblog.com/mashang/articles/52215.html</link><dc:creator>马上</dc:creator><author>马上</author><pubDate>Thu, 04 Dec 2008 15:31:00 GMT</pubDate><guid>http://www.cnitblog.com/mashang/articles/52215.html</guid><wfw:comment>http://www.cnitblog.com/mashang/comments/52215.html</wfw:comment><comments>http://www.cnitblog.com/mashang/articles/52215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mashang/comments/commentRss/52215.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mashang/services/trackbacks/52215.html</trackback:ping><description><![CDATA[<span class="bodycopy">
<div class="Section1">
<p><a name="more">1. Construct the abstract delegate base class</a></p>
</div>
<pre><span class="codeKeyword"><a name="more">class</a></span><a name="more"> Delegate {<br><span class="codeKeyword">public</span>:<br>      <span class="codeKeyword">virtual</span> <span class="codeKeyword">void</span> Invoke()=0;<br><span class="codeKeyword">protected</span>:<br>      Delegate(){}<br>      <span class="codeKeyword">virtual</span> ~Delegate(){}<br>};</a></pre>
<p><a name="more">2. Construct a derive class which accepts a static/global function pointer</a></p>
<pre><span class="codeComment"><a name="more">//NonTypeDelegate.h</a></span><br><span class="codeKeyword"><a name="more">#include</a></span><a name="more"> "Delegate.h"<br><br><span class="codeKeyword">class</span> NonTypeDelegate : <span class="codeKeyword">public</span> Delegate<br>{<br><span class="codeKeyword">public</span>:<br>   <span class="codeKeyword">void</span> Invoke();<br>   NonTypeDelegate(<span class="codeKeyword">void</span> (*pfn)(<span class="codeKeyword">int</span>),<span class="codeKeyword">int</span> iParam);<br>   <span class="codeKeyword">virtual</span> ~NonTypeDelegate(){}<br><span class="codeKeyword">private</span>:<br>   <span class="codeKeyword">void</span> (*m_pfn)(<span class="codeKeyword">int</span>);<br>   <span class="codeKeyword">int</span> m_iParam;<br>};<br><br><span class="codeComment">//NonTypeDelegate.cpp</span><br><span class="codeKeyword">#include</span> "NonTypeDelegate.h"<br><span class="codeKeyword">#include</span> &lt;iostream&gt;<br><br><span class="codeKeyword">using</span> <span class="codeKeyword">namespace</span> std;<br><br>NonTypeDelegate::NonTypeDelegate(<span class="codeKeyword">void</span> (*pfn)(<span class="codeKeyword">int</span>),<br>                                 <span class="codeKeyword">int</span> iParam):m_pfn(pfn),<br>                                 m_iParam(iParam)<br>{<br>}<br><br><span class="codeKeyword">void</span> NonTypeDelegate::Invoke()<br>{<br>   cout &lt;&lt; "NonTypeDelegate Invoke\r\n";<br>   m_pfn(m_iParam);<br>}</a></pre>
<p><a name="more">3. Construct another derive class which accepts a member function pointer</a></p>
<pre><span class="codeComment"><a name="more">//TypeDelegate.hpp</a></span><br><span class="codeKeyword"><a name="more">#include</a></span><a name="more"> "Delegate.h"<br><span class="codeKeyword">#include</span> &lt;iostream&gt;<br><br><span class="codeKeyword">using</span> <span class="codeKeyword">namespace</span> std;<br><br><span class="codeKeyword">template</span> &lt;<span class="codeKeyword">typename</span> T&gt;<br><br><span class="codeKeyword">class</span> TypeDelegate : <span class="codeKeyword">public</span> Delegate<br>{<br><span class="codeKeyword">public</span>:<br>   <span class="codeKeyword">void</span> Invoke();<br>   TypeDelegate(T &amp;t, <span class="codeKeyword">void</span> (T::*pfn)(<span class="codeKeyword">int</span>), <span class="codeKeyword">int</span> iParam);<br>   ~TypeDelegate(){}<br><br><span class="codeKeyword">private</span>:<br>   T m_t;<br>   <span class="codeKeyword">void</span> (T::*m_pfn)(<span class="codeKeyword">int</span>);<br>   <span class="codeKeyword">int</span> m_iParam;<br>};<br><br><span class="codeKeyword">template</span>&lt;<span class="codeKeyword">typename</span> T&gt;<br>TypeDelegate&lt;T&gt;::TypeDelegate(T &amp;t,<br>                              <span class="codeKeyword">void</span> (T::*pfn)(<span class="codeKeyword">int</span>),<br>                              <span class="codeKeyword">int</span> iParam):m_t(t),<br>                              m_pfn(pfn),<br>                              m_iParam(iParam)<br>{<br>}<br><br><span class="codeKeyword">template</span>&lt;<span class="codeKeyword">typename</span> T&gt;<br><br><span class="codeKeyword">void</span> TypeDelegate&lt;T7gt;::Invoke()<br>{<br>   cout &lt;&lt; "TypeDelegate Invoke\r\n";<br>   (m_t.*m_pfn)(m_iParam);<br>}</a></pre>
<p><a name="more">4. Now glue up all the stuffs</a></p>
<pre><span class="codeKeyword"><a name="more">#include</a></span><a name="more"> &lt;iostream&gt;<br><span class="codeKeyword">#include</span> "NonTypeDelegate.h"<br><span class="codeKeyword">#include</span> "TypeDelegate.hpp"<br><span class="codeKeyword">#include</span> &lt;vector&gt;<br><br><span class="codeKeyword">using</span> <span class="codeKeyword">namespace</span> std;<br><br><span class="codeKeyword">void</span> Test(<span class="codeKeyword">int</span> iParam)<br>{<br>   cout &lt;&lt; "Test Invoked\r\n";<br>}<br><br><span class="codeKeyword">class</span> A<br>{<br> <span class="codeKeyword">public</span>:<br>    <span class="codeKeyword">void</span> Test(<span class="codeKeyword">int</span> iParam)<br>    {<br>       cout &lt;&lt; "A::Test Invoked\r\n";<br>    }<br>};<br><br><span class="codeKeyword">int</span> main(<span class="codeKeyword">int</span> argc, <span class="codeKeyword">char</span>* argv[])<br>{<br>   NonTypeDelegate nTDelegate(Test,1);<br><br>   A a;<br>   TypeDelegate&lt;A&gt; tDelegate(a,A::Test,2);<br><br>   vector&lt;Delegate*&gt; vecpDelegate;<br>   vecpDelegate.push_back(&amp;nTDelegate);<br>   vecpDelegate.push_back(&amp;tDelegate);<br><br>   <span class="codeKeyword">for</span> (vector&lt;Delegate*&gt;::const_iterator kItr=vecpDelegate.begin();<br>       kItr!=vecpDelegate.end();<br>       ++kItr)<br>   {<br>       (*kItr)-&gt;Invoke();<br>   }<br><br>   <span class="codeKeyword">return</span> 0;<br>}</a></pre>
<p><a name="more">5. And the output is</a></p>
<pre><a name="more">NonTypeDelegate Invoke<br>Test Invoked<br>TypeDelegate Invoke<br>A::Test Invoked</a></pre>
<h3><a name="more">Conclusion</a></h3>
<p><a name="more">Actually, you can derive a class which can accept
different signature of functions pointer. Thanks to the powerful
"external polymorphism" pattern.</a></p>
<p><a name="more"><span class="bodycopy"><span class="bodycopy">
<h3><a name="more">References</a></h3>
<p><a name="more">Chris Cleeland, Douglas C.Schmidt and Timothy H.Harrison <em>External Polymorphism : An Object Structural Pattern for Transparently Extending C++ Concrete Data Types</em></a></p>
</span></span></a></p>
</span> <img src ="http://www.cnitblog.com/mashang/aggbug/52215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mashang/" target="_blank">马上</a> 2008-12-04 23:31 <a href="http://www.cnitblog.com/mashang/articles/52215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中使用GetModuleFileName获取应用程序路径</title><link>http://www.cnitblog.com/mashang/articles/51954.html</link><dc:creator>马上</dc:creator><author>马上</author><pubDate>Thu, 27 Nov 2008 12:35:00 GMT</pubDate><guid>http://www.cnitblog.com/mashang/articles/51954.html</guid><wfw:comment>http://www.cnitblog.com/mashang/comments/51954.html</wfw:comment><comments>http://www.cnitblog.com/mashang/articles/51954.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/mashang/comments/commentRss/51954.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mashang/services/trackbacks/51954.html</trackback:ping><description><![CDATA[<br>
<div id="blog_text" class="cnt">
<div class="postTitle">.\\与API函数GetModuleFileName获取应用程序目录有何不一样？ <hr>
采用.\\也能获得应用程序目录，采用GetModuleFileName也能获得，二者有何不同？ <hr>
一样！<br>
一个是相对路径，一个是绝对路径 <hr>
.\\是的到应用程序的当前目录，但当前目录不一定等于应用程序执行文件的所在目录，一个应用程序被启动时，当前目录是可以被任意设置的。<br>
GetModuleFileName()得到模块的完整路径名，例如，你载入c:\windows\system32\a.dll，得到模块句柄h，则你可以用GetModuleFileName()得到h模块的完整路径名。 <hr>
.\\一般用在包含头文件的语句中。<br>
另一个是程序编译后起作用的，例如，打开自定义的配置文件等。 <hr>
如何去取得这个Hanlde? <hr>
如果你直接用LoadLibrary()或AfxLoadLibrary()载入dll，该函数返回值就是handle；<br>
如果你隐式载入dll, 用GetModuleHandle("dll文件名")也可以得到handle； <br>
</div>
<div class="postTitle">
<p>MFC程序得到本身路径</p>
<p>在开发工程中，往往需要知道当前程序本身所在目录。<br>
一种方法是在程序安装的时候利用安装程序把文件路径写入注册表。在较大的程序中，这种方法比较常用<br>
另一种，就是在程序得到路径。这样，程序随便移动到哪里，都可以得到正确的路径。这也是本文介绍的方法。</p>
<p>方法一：<br>
[code]<br>
//得到帮助文件的路径<br>
CString strFullName = AfxGetApp()-&gt;m_pszHelpFilePath;<br>
//得到的是：X:\XXXX\XXX.hlp</p>
<p>//解析路径，得到当前运行程序所在目录<br>
char drive[_MAX_DRIVE];<br>
char dir[_MAX_DIR];</p>
<p>_splitpath(strAppName, drive, dir, NULL,NULL);<br>
CString strPath;<br>
strPath.Format("%s%s", drive, dir);<br>
//strPath即为得到的当前运行程序所在目录<br>
[/code]<br>
另外，AfxGetApp()-&gt;m_pszAppName 得到应用程序名称<br>
AfxGetApp()-&gt;m_pszExeName 得到程序文件名，不包括扩展名</p>
<p>方法二：<br>
得到全路径<br>
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH<br>
GetModuleFileName(NULL,exeFullPath,MAX_PATH);//得到程序模块名称，全路径<br>
也就是当前运行程序的全路径<br>
利用方法一的解析路径的方法，即可得到程序所在路径。</p>
<p>GetModuleFileName函数原型<br>
DWORD GetModuleFileName(<br>
&nbsp;&nbsp; HMODULE hModule,&nbsp;&nbsp;&nbsp;&nbsp; // handle to module。将要得到的模块的句柄。如果是当前模块，NULL<br>
&nbsp;&nbsp; LPTSTR lpFilename,&nbsp;&nbsp; // path buffer&nbsp;&nbsp; 得到的文件名。<br>
&nbsp;&nbsp; DWORD nSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // size of buffer&nbsp;&nbsp; 一般MAX_PATH就可以了<br>
);</p>
</div>
</div><img src ="http://www.cnitblog.com/mashang/aggbug/51954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mashang/" target="_blank">马上</a> 2008-11-27 20:35 <a href="http://www.cnitblog.com/mashang/articles/51954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>