﻿<?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>语源科技BlogJava-狂龙剑侠</title><link>http://www.blogjava.net/daiyie/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 11:31:11 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 11:31:11 GMT</pubDate><ttl>60</ttl><item><title>Visual C++ 8.0对象布局的奥秘：虚函数、多继承、虚拟继承 </title><link>http://www.blogjava.net/daiyie/archive/2007/12/07/165953.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Fri, 07 Dec 2007 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/12/07/165953.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/165953.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/12/07/165953.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/165953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/165953.html</trackback:ping><description><![CDATA[&nbsp;
<div class="postTitle"><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/neoragex2002/archive/2007/11/01/VC8_Object_Layout_Secret.html">Visual C++ 8.0对象布局的奥秘：虚函数、多继承、虚拟继承</a> </div>
哈哈，从M$ Visual C++ Team的<a href="http://blogs.msdn.com/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx">Andy Rich</a>那里又偷学到一招：VC8的隐含编译项<strong>/d1reportSingleClassLayout</strong>和<strong>/d1reportAllClassLayout </strong>。看个复杂的例子吧(如下)，现在假设我们想知道Derived类的对象布局，怎么办? 在Project Properties-&gt;C++-&gt;Command Line-&gt;Additional Options里面加上<strong>/d1reportSingleClassLayoutDerived</strong>吧！<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 9pt; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; line-height: 16px; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; font-family: Consolas,新宋体; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;CommonBase<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;co;<br />
};<br />
<br />
</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Base1:&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;CommonBase<br />
{<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;print1()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;print2()&nbsp;{}<br />
</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;b1;<br />
};<br />
<br />
</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Base2:&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;CommonBase<br />
{<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;dump1()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">virtual</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;dump2()&nbsp;{}<br />
</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;b2;<br />
};<br />
<br />
</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Derived:&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;Base1,&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;Base2<br />
{<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;print2()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;dump2()&nbsp;{}<br />
</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;d;<br />
};<br />
<br />
</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;_tmain(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;<br />
}</span></div>
<br />
F5编译之，你会惊奇地发现，Output里面有如下字样：<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 9pt; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; line-height: 16px; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; font-family: Consolas,新宋体; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,128,128)">&nbsp;1</span>&nbsp;<span style="color: rgb(0,0,0)">class&nbsp;Derived&nbsp;size(</span><span style="color: rgb(0,0,0)">32</span><span style="color: rgb(0,0,0)">):<br />
</span><span style="color: rgb(0,128,128)">&nbsp;2</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;+---<br />
</span><span style="color: rgb(0,128,128)">&nbsp;3</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;|&nbsp;+---&nbsp;(base&nbsp;class&nbsp;Base1)<br />
</span><span style="color: rgb(0,128,128)">&nbsp;4</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;{vfptr}<br />
</span><span style="color: rgb(0,128,128)">&nbsp;5</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;{vbptr}<br />
</span><span style="color: rgb(0,128,128)">&nbsp;6</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">8</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;b1<br />
</span><span style="color: rgb(0,128,128)">&nbsp;7</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;|&nbsp;+---<br />
</span><span style="color: rgb(0,128,128)">&nbsp;8</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;|&nbsp;+---&nbsp;(base&nbsp;class&nbsp;Base2)<br />
</span><span style="color: rgb(0,128,128)">&nbsp;9</span>&nbsp;<span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;{vfptr}<br />
</span><span style="color: rgb(0,128,128)">10</span>&nbsp;<span style="color: rgb(0,0,0)">16</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;{vbptr}<br />
</span><span style="color: rgb(0,128,128)">11</span>&nbsp;<span style="color: rgb(0,0,0)">20</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;|&nbsp;b2<br />
</span><span style="color: rgb(0,128,128)">12</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;|&nbsp;+---<br />
</span><span style="color: rgb(0,128,128)">13</span>&nbsp;<span style="color: rgb(0,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;d<br />
</span><span style="color: rgb(0,128,128)">14</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;+---<br />
</span><span style="color: rgb(0,128,128)">15</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;+---&nbsp;(virtual&nbsp;base&nbsp;CommonBase)<br />
</span><span style="color: rgb(0,128,128)">16</span>&nbsp;<span style="color: rgb(0,0,0)">28</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;co<br />
</span><span style="color: rgb(0,128,128)">17</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;+---<br />
</span><span style="color: rgb(0,128,128)">18</span>&nbsp;<span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">19</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::$vftable@Base1@:<br />
</span><span style="color: rgb(0,128,128)">20</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;&amp;Base1::print1<br />
</span><span style="color: rgb(0,128,128)">21</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;&amp;Derived::print2<br />
</span><span style="color: rgb(0,128,128)">22</span>&nbsp;<span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">23</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::$vftable@Base2@:<br />
</span><span style="color: rgb(0,128,128)">24</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;&amp;Base2::dump1<br />
</span><span style="color: rgb(0,128,128)">25</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;&amp;Derived::dump2<br />
</span><span style="color: rgb(0,128,128)">26</span>&nbsp;<span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">27</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::$vbtable@Base1@:<br />
</span><span style="color: rgb(0,128,128)">28</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;-</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">29</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;</span><span style="color: rgb(0,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;(Derivedd(Base1+</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)">)CommonBase)<br />
</span><span style="color: rgb(0,128,128)">30</span>&nbsp;<span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">31</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::$vbtable@Base2@:<br />
</span><span style="color: rgb(0,128,128)">32</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;-</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">33</span>&nbsp;<span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;|&nbsp;</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">&nbsp;(Derivedd(Base2+</span><span style="color: rgb(0,0,0)">4</span><span style="color: rgb(0,0,0)">)CommonBase)<br />
</span><span style="color: rgb(0,128,128)">34</span>&nbsp;<span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">35</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::print2&nbsp;this&nbsp;adjustor:&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,128)">36</span>&nbsp;<span style="color: rgb(0,0,0)">Derived::dump2&nbsp;this&nbsp;adjustor:&nbsp;</span><span style="color: rgb(0,0,0)">12</span></div>
<br />
看到了吗? VC8居然输出了Derived对象的完整布局! 我们终于可以不必两眼一抹黑般的去peek/poke了....第1行表明，Derived对象总占用了32字节；其由三部分组成，分别是行3-行7、行 8-行12、行13、行28；其中前二者分别是基类Base1、Base2的布局，最后的行28为虚拟基类Common的布局。<br />
<br />
以基类 Base1部分为例，可发现其由一个虚函数表指针vftable和虚基表指针vbtable构成，先看Base1部分的vftable所指向的虚表$ vftable@Base1(行19)，不难发现，其中的表项2已经被Derived::print2给override了；再来看Base2部分的 vftable所指向的虚表$vftable@Base2(行23)，可发现，同样的，Base2::dump2被Derived::dump2给 override了。这不明摆着就是虚函数机制嘛，heh~<br />
<br />
值得注意的是，这个例子同时说明，多继承场合下，其实在单一对象中是存在多个 this指针的....行35-36给出了如何将Derived的this指针校正为其基类子对象this指针的偏移量，也就是说，根据行36，假设有个 Derived d，那么d.dump1()实际上应该理解成通过虚表$vftable@Base2对((Base2*)(((char*)&amp;d)+12))- &gt;dump1()的调用....即传递给所有Base2成员函数的this指针应该是(Base2*)((char*)(&amp;d)+12)，这里可能我写得恐怖了点，意思到了就成....这不，普通继承、多继承、对象Slicing的语义都在这个布局里面了，看仔细了哈~<br />
<br />
OK，多继承看完了，继续看虚拟基类是如何布局的。虚基Common在Derived的布局中，位于Derived本身数据成员之后的位置。Base1、 Base2中均保存了一个vbtable指针，其分别指向各自所使用的虚基表$vbtable@Base1和$vbtable@Base2，为什么要指向一个虚基表? 很简单，因为Base1、Base2有可能会同时继承多个不同的虚拟基类.....这充分体现了C++对象布局的复杂性....在每个虚基表中，保存了所继承的虚拟基类部分相对于子类部分vbtable指针的偏移值，以Base2为例，我们知道Base2的vbtable在Derived中的偏移值为16 (行10)，则根据$vbtable@Base2，虚基Common部分距离Base2 vbtable指针的偏移值为12,则有虚基Common在Derived中的总偏移值为16+12。与普通多继承同理，我们在调用非虚拟的虚基成员函数时，必须将Derived的this指针调整为指向虚基部分的this指针，只有这样才能成功地访问虚基自身的数据成员和虚基的虚拟函数(通过虚基自己的 vftable，为简单起见，上例中我就没弄那么复杂了，大家可以自己玩玩，明白如何举一反三即可) 
<img src ="http://www.blogjava.net/daiyie/aggbug/165953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-12-07 09:56 <a href="http://www.blogjava.net/daiyie/archive/2007/12/07/165953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KeepPass</title><link>http://www.blogjava.net/daiyie/archive/2007/10/25/155956.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Thu, 25 Oct 2007 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/10/25/155956.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/155956.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/10/25/155956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/155956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/155956.html</trackback:ping><description><![CDATA[<h4>Transferring the Password</h4>
<p>There are various ways to get the passwords stored in KeePass into other windows. The first, and most simple method is copying them to the clipboard. For this, just double-click onto the specific field in the main password list. Example: if you want to copy the password of entry X, point onto the password field of the entry in the main view and double-click. The password is copied to the clipboard. If you enable the auto-clearing option, KeePass will clear the clipboard automatically after some seconds. This prevents you from forgetting to clear the clipboard yourself, leaving sensitive data in the clipboard.</p>
<p>The second method is drag-n-drop. As in method 1, point onto the field you want to use, click the left mouse button and hold it. Drag the data into other windows.</p>
<p>The third, and the most powerful method is auto-type. KeePass features a very mighty auto-type feature, which types user names, passwords, etc. into other windows for you. The default auto-typing sequence is: {USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}. But this sequence is customizable, per entry (read the CHM documentation file that comes with KeePass for more about this). This makes the auto-type feature applicable to all windows and webforms you'll ever see. There are two submethods to perform an auto-type:</p>
<ul>
    <li><strong>Selecting an entry</strong>: Just select the entry that you want to get auto-typed, right-click onto it and click "Perform Auto-Type". KeePass will minimize itself, the window that had the focus before will come to the front. KeePass starts typing the data into this window.
    <li><strong>Global hot key</strong>: This is the most powerful of all methods. You leave KeePass running in the background. As soon as you're on a site that requires a login (the password of which you stored in KeePass before), just press a hot key (by default, Ctrl-Alt-A). KeePass immediately auto-types the data into the target window. </li>
</ul>
 <img src ="http://www.blogjava.net/daiyie/aggbug/155956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-10-25 21:31 <a href="http://www.blogjava.net/daiyie/archive/2007/10/25/155956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bind</title><link>http://www.blogjava.net/daiyie/archive/2007/09/23/147584.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Sun, 23 Sep 2007 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/09/23/147584.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/147584.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/09/23/147584.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/147584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/147584.html</trackback:ping><description><![CDATA[<p>#include &lt;boost/config.hpp&gt;<br />
#include &lt;boost/bind.hpp&gt;<br />
#include &lt;iostream&gt;<br />
#include &lt;vector&gt;<br />
#include &lt;algorithm&gt;</p>
<p>template&lt;class T&gt;<br />
inline T &amp; ToRef( T *pT)<br />
{<br />
&nbsp;return *pT;<br />
}<br />
#define TODEF(x) bind( ToRef&lt;x&gt;, _1)</p>
<p>template&lt;class T&gt;<br />
inline void DeletePointer( T *pT)<br />
{<br />
&nbsp;delete pT;<br />
}<br />
#define ALL(v) (v).begin(), (v).end() </p>
<p>struct X<br />
{<br />
public:<br />
&nbsp;int m_t;<br />
&nbsp;X():m_t(11)<br />
&nbsp;{<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; bool f(int a)<br />
&nbsp;{<br />
&nbsp;&nbsp;std::cout &lt;&lt; m_t &lt;&lt; std::endl;<br />
&nbsp;&nbsp;return true; <br />
&nbsp;}<br />
};</p>
<p>int main()<br />
{<br />
&nbsp;&nbsp;&nbsp; using namespace boost;<br />
&nbsp;using namespace std;<br />
&nbsp;<br />
&nbsp;vector&lt;X *&gt; v;<br />
&nbsp;for( int i=0; i&lt;10; ++i)<br />
&nbsp;&nbsp;v.push_back( new X);<br />
&nbsp;<br />
&nbsp;for_each( ALL(v), bind(&amp;X::f, TODEF(X), 4 ) );<br />
&nbsp;<br />
&nbsp;for_each( ALL(v), bind( DeletePointer&lt;X&gt;, _1) );<br />
&nbsp;<br />
&nbsp;return 0;<br />
}</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/daiyie/aggbug/147584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-09-23 17:09 <a href="http://www.blogjava.net/daiyie/archive/2007/09/23/147584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>论兔子如何吃掉狼</title><link>http://www.blogjava.net/daiyie/archive/2007/05/23/119430.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Wed, 23 May 2007 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/05/23/119430.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/119430.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/05/23/119430.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/119430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/119430.html</trackback:ping><description><![CDATA[<div class=xspace-itemmessage id=xspace-item-18284>一天，一只兔子在山洞前写论文。 <br>一只狼过来，问兔子：&#8216;你在写什么？&#8221;　 <br>答：&#8220;论文&#8221; <br>狼问：&#8220;你的论文的主题是什么？&#8221;　 <br>答：&#8220;《论兔子如何吃掉狼》&#8221;。 <br>狼听了哈哈大笑。 <br>兔子说，我写的论文大部分稿子在洞里，我把道理写的很清楚。 <br>狼想看看兔子的论文是怎么写的。于是兔子把狼领进山洞。 <br>过了一会，兔子独自走出山洞。 <br><br>兔子继续在山洞前写它的论文。 <br>一只狐狸过来，问：&#8220;你在写什么？&#8221; <br>答：&#8220;我在写论文&#8221;。 <br>&#8220;论文的主题是什么？&#8221;　 <br>答：&#8220;论兔子如何吃掉狐狸&#8221;。　 <br>向来狡猾的狐狸也笑了。说：&#8220;这怎么可能呢&#8221; <br>兔子说：&#8220;我写的大部分稿子还在洞里，我把道理写的很清楚。&#8221; <br>狐狸想去看看兔子的论文是怎么写的，于是兔子把狐狸领进山洞。<br>过了一会儿，兔子独自一个走出山洞。 <br><br>最后，在山洞里一只狮子在几堆白骨之间，满意地一边剔着牙，一边阅读兔子交给它的论文的提要：&#8220;一个动物，能力大小并不重要，关键看你的导师是谁。</div>
<img src ="http://www.blogjava.net/daiyie/aggbug/119430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-05-23 16:27 <a href="http://www.blogjava.net/daiyie/archive/2007/05/23/119430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选狼还是选狮子</title><link>http://www.blogjava.net/daiyie/archive/2007/05/23/119429.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Wed, 23 May 2007 08:25:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/05/23/119429.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/119429.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/05/23/119429.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/119429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/119429.html</trackback:ping><description><![CDATA[<p><font size=3><span>据说这是道中国人老是选错的题，当然这样说是有所隐喻的，不过我们大可以跳出政治的范畴，实际点说，对于政治，我们大多数人是心有余而力不足的，于是会有各种表现，焦虑的就成了愤青一族，忍受的就成了洗脑一族，总之都没什么好词儿，还没怎么呢就先自己掐起来了</span><span><font face="Times New Roman">......</font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>上帝把两群羊放在草原上，一群在南，一群在北。</span></font></p>
<p><font size=3><span>上帝还给羊群找了两种天敌，一种是狮子，一种是狼。</span></font></p>
<p><font size=3><span>上帝对羊群说</span><span><font face="Times New Roman">:</font></span><span>&#8220;如果你们要狼，就给一只，任它随意咬你们。</span></font></p>
<p><font size=3><span>如果你们要狮子，就给两头，你们可以在两头狮子中任选一头，还可以随时更换。&#8221;</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>这道题的问题就是：如果你也在羊群中，你是选狼还是选狮子？</span></font></p>
<p><font size=3><span>很容易做出选择吧？</span></font></p>
<p><font size=3><span>好吧，记住你的选择，接著往下看。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>南边那群羊想</span><span><font face="Times New Roman">,</font></span><span>狮子比狼凶猛得多</span><span><font face="Times New Roman">,</font></span><span>还是要狼吧。于是</span><span><font face="Times New Roman">,</font></span><span>它们就要了一只狼。</span></font></p>
<p><font size=3><span>北边那群羊想，狮子虽然比狼凶猛得多，但我们有选择权，还是要狮子吧。于是，它们就要了两头狮子。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>那只狼进了南边的羊群后，就开始吃羊。</span></font></p>
<p><font size=3><span>狼身体小，食量也小，一只羊够它吃几天了。</span></font></p>
<p><font size=3><span>这样羊群几天才被追杀一次。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>北边那群羊挑选了一头狮子，另一头则留在上帝那里。</span></font></p>
<p><font size=3><span>这头狮子进入羊群后</span><span><font face="Times New Roman">,</font></span><span>也开始吃羊。狮子不但比狼凶猛，而且食量惊人，每天都要吃一只羊。</span></font></p>
<p><font size=3><span>这样羊群就天天都要被追杀，惊恐万状。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>羊群赶紧请上帝换一头狮子。不料，上帝保管的那头狮子一直没有吃东西，正饥饿难耐</span><span><font face="Times New Roman">,</font></span><span>它扑进羊群，比前面那头狮子咬得更疯狂。</span></font></p>
<p><font size=3><span>羊群一天到晚只是逃命，连草都快吃不成了。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>南边的羊群庆幸自己选对了天敌，又嘲笑北边的羊群没有眼光。</span></font></p>
<p><font size=3><span>北边的羊群非常后悔，向上帝大倒苦水</span><span><font face="Times New Roman">,</font></span><span>要求更换天敌，改要一只狼。</span></font></p>
<p><font size=3><span>上帝说：&#8220;天敌一旦确定，就不能更改</span><span><font face="Times New Roman">,</font></span><span>必须世代相随</span><span><font face="Times New Roman">,</font></span><span>你们唯一的权利是在两头狮子中选择。&#8221;</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>北边的羊群只好把两头狮子不断更换。</span></font></p>
<p><font size=3><span>可两头狮子同样凶残，换哪一头都比南边的羊群悲惨得多，它们索性不换了</span><span><font face="Times New Roman">,</font></span><span>让一头狮子吃得膘肥体壮</span><span><font face="Times New Roman">,</font></span><span>另一头狮子则饿得精瘦。</span></font></p>
<p><font size=3><span>眼看那头瘦狮子快要饿死了</span><span><font face="Times New Roman">,</font></span><span>羊群才请上帝换一头。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>这头瘦狮子经过长时间的饥饿后</span><span><font face="Times New Roman">,</font></span><span>慢慢悟出了一个道理</span><span><font face="Times New Roman">:</font></span></font></p>
<p><font size=3><span>自己虽然凶猛异常</span><span><font face="Times New Roman">,</font></span><span>一百只羊都不是对手</span><span><font face="Times New Roman">,</font></span><span>可是自己的命运是操纵在羊群手里的。</span></font></p>
<p><font size=3><span>羊群随时可以把自己送回上帝那里</span><span><font face="Times New Roman">,</font></span><span>让自己饱受饥饿的煎熬</span><span><font face="Times New Roman">,</font></span><span>甚至有可能饿死。</span></font></p>
<p><font size=3><span>想通这个道理后</span><span><font face="Times New Roman">,</font></span><span>瘦狮子就对羊群特别客气</span><span><font face="Times New Roman">,</font></span><span>只吃死羊和病羊</span><span><font face="Times New Roman">,</font></span><span>凡是健康的羊它都不吃了。</span></font></p>
<p><font size=3><span>羊群喜出望外</span><span><font face="Times New Roman">,</font></span><span>有几只小羊提议干脆固定要瘦狮子</span><span><font face="Times New Roman">,</font></span><span>不要那头肥狮子了。</span></font></p>
<p><font size=3><span>一只老公羊提醒说</span><span><font face="Times New Roman">:</font></span><span>&#8220;瘦狮子是怕我们送它回上帝那里挨饿</span><span><font face="Times New Roman">,</font></span><span>才对我们这么好。</span></font></p>
<p><font size=3><span>万一肥狮子饿死了</span><span><font face="Times New Roman">,</font></span><span>我们没有了选择的余地</span><span><font face="Times New Roman">,</font></span><span>瘦狮子很快就会恢复凶残的本性。&#8221;</span></font></p>
<p><font size=3><span>羊群觉得老羊说得有理</span><span><font face="Times New Roman">,</font></span><span>为了不让另一头狮子饿死</span><span><font face="Times New Roman">,</font></span><span>它们赶紧把它换回来。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>原先膘肥体壮的那头狮子</span><span><font face="Times New Roman">,</font></span><span>已经饿得只剩下皮包骨头了</span><span><font face="Times New Roman">,</font></span><span>并且也懂得了自己的命运是操纵在羊群手里的道理。</span></font></p>
<p><font size=3><span>为了能在草原上待久一点</span><span><font face="Times New Roman">,</font></span><span>它竟百般讨好起羊群来。而那头被送交给上帝的狮子</span><span><font face="Times New Roman">,</font></span><span>则难过得流下了眼泪。</span></font></p>
<p><font size=3><span>北边的羊群在经历了重重磨难后</span><span><font face="Times New Roman">,</font></span><span>终于过上了自由自在的生活。</span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span>南边的那群羊的处境却越来越悲惨了</span><span><font face="Times New Roman">,</font></span><span>那只狼因为没有竞争对手</span><span><font face="Times New Roman">,</font></span><span>羊群又无法更换它</span><span><font face="Times New Roman">,</font></span></font></p>
<p><font size=3><span>它就胡作非为</span><span><font face="Times New Roman">,</font></span><span>每天都要咬死几十只羊</span><span><font face="Times New Roman">,</font></span><span>这只狼早已不吃羊肉了</span><span><font face="Times New Roman">,</font></span><span>它只喝羊心里的血。</span></font></p>
<p><font size=3><span>它还不准羊叫</span><span><font face="Times New Roman">,</font></span><span>哪只叫就立刻咬死哪只。</span></font></p>
<p><font size=3><span>南边的羊群只能在心中哀叹</span><span><font face="Times New Roman">:</font></span><span>&#8220;早知道这样，还不如要两头狮子。&#8221;</span></font></p>
<img src ="http://www.blogjava.net/daiyie/aggbug/119429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-05-23 16:25 <a href="http://www.blogjava.net/daiyie/archive/2007/05/23/119429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++库讨论</title><link>http://www.blogjava.net/daiyie/archive/2007/05/15/117727.html</link><dc:creator>daiyie</dc:creator><author>daiyie</author><pubDate>Tue, 15 May 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/daiyie/archive/2007/05/15/117727.html</guid><wfw:comment>http://www.blogjava.net/daiyie/comments/117727.html</wfw:comment><comments>http://www.blogjava.net/daiyie/archive/2007/05/15/117727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/daiyie/comments/commentRss/117727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/daiyie/services/trackbacks/117727.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
开始之前，确认：<br>1.安装完成Visual Studio 2005，确认安装的时候选中了Unicode MFC version以及CRT source code（默认是选中的，如果你没有改动的话那么应该是装上了的）；<br>2.找到我们要动手术的目录，在$(Program Files)\Microsoft Visual Studio 8\VC 下，找出ATLMFC\SRC和CRT\SRC两个文件夹；<br>3.（可选）安装Platform SDK，复制最新版本的unicows.lib放到VC\PlatformSDK\LIB中。VC8自带有unicows.lib，所以这一步可以不做。<br>一：编译MSLU的CRT库8.0<br>首先请备份一下VC\Lib、VC\CRT\SRC、VC\ATLMFC\SRC、VC\ATLMFC\lib这四个文件夹（包括子文件夹），假如不小心改错的话可以直接从备份的文件夹里复制文件出来。<br>CRT库需要编译的是这6个DLL：MSVCR80.DLL、MSVCP80.DLL、MSVCM80.DLL、MSVCR80D.DLL、MSVCP80D.DLL、MSVCM80D.DLL。为方便操作，我们把将要输出的MSLU的CRT库文件改为别的名字以免和原来的混淆，分别改成：MSLUR80.DLL、MSLUR80D.DLL、MSLUP80.DLL、MSLUP80D.DLL、MSLUM80.DLL、MSLUM80D.DLL（如果你改成别的名字的话，后面的操作请做相应的改正）。<br>（1）先把SRC目录下的相应文件改名：<br>copy _SAMPLE_.RC MSLUR80.RC<br>copy SAMPLE_P.RC MSLUP80.RC<br>copy SAMPLE_M.RC MSLUM80.RC<br>copy SAMPLE_P.DEF MSLUP80.DEF<br>copy SAMPLD_P.DEF MSLUP80D.DEF<br>copy SAMPLE_M.DEF MSLUM80.DEF<br>copy SAMPLD_M.DEF MSLUM80D.DEF<br>copy SAMPLE_U.DEF MSLUU80.DEF<br>copy SAMPLD_U.DEF MSLUU80D.DEF<br>copy Intel\_SAMPLE_.DEF Intel\MSLUR80.DEF<br>copy Intel\_SAMPLD_.DEF Intel\MSLUR80D.DEF <br>（2）打开MSLUP80.DEF，修改LIBRARY SAMPLE_P为LIBRARY MSLUP80；<br>打开MSLUP80D.DEF，修改LIBRARY SAMPLD_P为LIBRARY MSLUP80D；<br>打开MSLUM80.DEF，修改LIBRARY SAMPLE_M为LIBRARY MSLUM80；<br>打开MSLUM80D.DEF，修改LIBRARY SAMPLD_M为LIBRARY MSLUM80D；<br>打开MSLUU80.DEF，修改LIBRARY SAMPLE_M为LIBRARY MSLUM80；（注意此处不是MSLUU80而是MSLUM80）<br>打开MSLUU80D.DEF，修改LIBRARY SAMPLD_M为LIBRARY MSLUM80D；（注意此处不是MSLUU80D而是MSLUM80D）<br>打开\Intel\MSLUR80.DEF，修改LIBRARY _SAMPLE_为LIBRARY MSLUR80；<br>打开\Intel\MSLUR80D.DEF，修改LIBRARY _SAMPLD_为LIBRARY MSLUR80D；<br>（3）打开SRC\makefile文件，修改开头部分为：<br>RETAIL_DLL_NAME=MSLUR80<br>RETAIL_DLL_NAME=MSLUR80<br>RETAIL_LIB_NAME=MSLUR80<br>RETAIL_DLLCPP_NAME=MSLUP80<br>RETAIL_LIBCPP_NAME=MSLUP80<br>RETAIL_DLLMIXED_NAME=MSLUM80<br>RETAIL_LIBMIXED_NAME=MSLUM80<br>RETAIL_LIBPURE_NAME=MSLUU80<br>RETAIL_PT_LIBMIXED_NAME=MLSUPTM<br>RETAIL_PT_LIBPURE_NAME=MLSUPTU<br>DEBUG_DLL_NAME=MSLUR80D<br>DEBUG_LIB_NAME=MSLUR80D<br>DEBUG_DLLCPP_NAME=MSLUP80D<br>DEBUG_LIBCPP_NAME=MSLUP80D<br>DEBUG_DLLMIXED_NAME=MSLUM80D<br>DEBUG_LIBMIXED_NAME=MSLUM80D<br>DEBUG_LIBPURE_NAME=MSLUU80D<br>DEBUG_PT_LIBMIXED_NAME=MLSUPTMD<br>DEBUG_PT_LIBPURE_NAME=MLSUPTUD<br>RC_NAME=MSLUR80<br>RCCPP_NAME=MSLUP80<br>RCMIXED_NAME=MSLUM80<br>54行处修改VCTOOLS，注意自己的VS2005安装目录，假如安装到E:\SoftWare\Microsoft Visual Studio 8\下，则此处改为：<br>VCTOOLS=E:\SoftWare\Microsoft Visual Studio 8\VC<br>1779, 1841, 1905, 1940, 2037, 2105, 2139, 2230行的kernel32.lib，改为：unicows.lib kernel32.lib（一共8个不要改多了）；<br>（4）打开Visual Studio 2005 command prompt（从开始菜单或者是vc8的开发环境的菜单都可以启动），进入到SRC目录，输入命令设置vctools，假如VS2005安装在E:\SoftWare\Microsoft Visual Studio 8\下，则输入：<br>Set vctools=E:\SoftWare\Microsoft Visual Studio 8\VC<br>完成后输入bldnt启动SRC目录下的bldnt.bat批处理文件编译CRT库。<br>译者：我编译的时候出来好多warning，不管他最后还是编译完成了。<br>（5）编译完成之后lib文件都放在SRC\BUILD\INTEL\目录下，把文件名字改回来以便以前的程序可以链接，而且下面编译MFC库也需要。DLL文件不用改，新的lib文件知道该链接到谁那里。改名：<br>copy MLSUPTM.LIB PTRUSTM.LIB<br>copy MLSUPTMD.LIB PTRUSTMD.LIB<br>copy MLSUPTU.LIB PTRUSTU.LIB<br>copy MLSUPTUD.LIB PTRUSTUD.LIB<br>copy MSLUR80.LIB MSVCRT.LIB<br>copy MSLUR80D.LIB MSVCRTD.LIB<br>copy MSLUP80.LIB MSVCPRT.LIB<br>copy MSLUP80D.LIB MSVCPRTD.LIB <br>copy MSLUM80.LIB MSVCMRT.LIB<br>copy MSLUM80D.LIB MSVCMRTD.LIB<br>copy MSLUU80.LIB MSVCURT.LIB<br>copy MSLUU80D.LIB MSVCURTD.LIB<br>（6）把改名后的lib文件复制到VC\LIB目录下覆盖原来的文件。<br>（7）把步骤（4）、（5）、（6）再执行一次来重建MSLUP80(D).DLL和静态库，以便他们能链接到我们自己的MSVCRT(D).LIB（指向我们的MSLUR80(D).DLL）。<br>关掉VS2005 command prompt，因为编译CRT库的时候定义了许多环境变量，这些会使后面MFC库的编译出现错误。<br>6个新的DLL文件都在\VC\crt\src\build\intel下，把这6个文件复制到系统目录下。<br>二：编译MSLU的MFC库8.0 Unicode版本<br>MFC库需要编译的是这4个DLL：<br>MFC80U.DLL (Unicode Release) <br>MFC80UD.DLL (Unicode Debug) <br>MFCM80U.DLL (Mixed mode/Managed Unicode Release) <br>MFCM80UD.DLL (Mixed mode/Managed Unicode Debug)。<br>为方便操作，我们把将要输出的MSLU的CRT库文件改为别的名字以免和原来的混淆，分别改成：<br>MFC80LU.DLL <br>MFC80LUD.DLL <br>MFCM80LU.DLL <br>MFCM80LUD.DLL<br>（如果你改成别的名字的话，后面的操作请做相应的改正）。<br>（1）打开VC\ATLMFC\SRC\MFC\MFCDLL.MAK，在274、307行的link @&lt;&lt;，后面插入一行变成：<br>&nbsp;link @&lt;&lt;<br>/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib<br>180行的<br>LIBS=$(CRTDLL) kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)<br>改为：<br>LIBS=$(CRTDLL) unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib oleacc.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)<br>（此处不同于原文。原文为：<br>LIBS=$(CRTDLL) unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)<br>译者依照原文修改，编译的时候出现了错误，增加数个lib文件后编译通过）<br>（2）打开VC\ATLMFC\SRC\MFCM\MFCMDLL.MAK，在253、272行的link @&lt;&lt;，后面插入一行变成：<br>&nbsp;link @&lt;&lt;<br>/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib<br>215行的<br>LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \<br>改为：<br>LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib mpr.lib oleacc.lib gdi32.lib msimg32.lib user32.lib \<br>（此处原文为：<br>LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \<br>其余说明同上）<br>（3）打开\VC\atlmfc\src\mfcm\INTEL\mfcm80u.def 文件，把第10行的LIBRARY mfcm80u 改为：<br>LIBRARY mfcm80Lu <br>打开\VC\atlmfc\src\mfcm\INTEL\mfcm80ud.def文件，把第10行的LIBRARY mfcm80ud改为：<br>LIBRARY mfcm80Lud<br>（4）打开\VC\atlmfc\src\mfcm\wfrmcmd.cpp文件，251行的#error Following information required to build private version用//注释掉或者直接把该行删掉；253行的[assembly: AssemblyTitle("")];改为：<br>[assembly: AssemblyTitle("mfcm80L")];<br>（5）打开\VC\atlmfc\src\mfcm\interfaces\AssemblyInfo.cpp文件，78行的#error Following information required to build private version用//注释掉或者直接把该行删掉；85行的[assembly: AssemblyTitle("")];改为：<br>[assembly: AssemblyTitle("mfcm80Lifaces")];<br>（6）在\VC\atlmfc\src\下建立一个批处理文件：buildmfc.bat，内容为：<br>nmake -f atlmfc.mak MFC libname=MFC80L<br>（7）打开Visual Studio 2005 command prompt，进入目录\VC\atlmfc\src\，输入buildmfc执行buildmfc.bat编译MFC库。<br>编译完成之后，在\VC\atlmfc\src\mfc\intel下有MFC80LU.DLL、MFC80LUD.DLL，在\VC\atlmfc\src\mfcm\INTEL下有MFCM80LU.DLL、MFCM80LUD.DLL，把这4个DLL文件复制到系统目录下；在\VC\atlmfc\lib\INTEL下有MFC80LU.LIB、MFC80LUD.LIB、MFCM80LU.lib、MFCM80LUD.lib，把文件名改为：<br>MFC80U.LIB、MFC80UD.LIB、MFCM80U.lib、MFCM80UD.lib<br>把这四个lib文件复制到\VC\atlmfc\lib下覆盖原来的文件就完成了。
<img src ="http://www.blogjava.net/daiyie/aggbug/117727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/daiyie/" target="_blank">daiyie</a> 2007-05-15 22:47 <a href="http://www.blogjava.net/daiyie/archive/2007/05/15/117727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>