??xml version="1.0" encoding="utf-8" standalone="yes"?>久久Av无码精品人妻系列,综合久久一区二区三区 ,欧美日韩精品久久久久http://www.shnenglu.com/SpringSnow/雪化了,花开了,春天来了zh-cnTue, 06 May 2025 15:25:15 GMTTue, 06 May 2025 15:25:15 GMT60及时ȝ很重?/title><link>http://www.shnenglu.com/SpringSnow/archive/2010/11/16/133834.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 16 Nov 2010 15:34:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2010/11/16/133834.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/133834.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2010/11/16/133834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/133834.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/133834.html</trackback:ping><description><![CDATA[<p>发现怹没有来园子里逛了Q一来是工作了,的确很忙Q二来是手的有Ҏ。想写点东西Q找来找去,q是对这个园子有感情?br><br>最q发现懒惰真的是一个很ҎL的习惯,它会慢慢吞噬掉一切。就目而言Q压力的比学生时要J重许多Q但条理性似乎更加重要。随手记下,随时ȝd是好的,一个回_׃知道什么是时候是个头了?br><br>所以半q多的经验来看,一定要及时的ȝ目Q要把最新鲜的,最热气腾腾的东西记录下来?br>对自己回是一个帮助,对他人入门也是个捷径?br><br>L及时ȝ的习惯很重要?/p> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/133834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2010-11-16 23:34 <a href="http://www.shnenglu.com/SpringSnow/archive/2010/11/16/133834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>感谢所有帮助我的hhttp://www.shnenglu.com/SpringSnow/archive/2009/12/21/103651.htmlSandySandyMon, 21 Dec 2009 14:29:00 GMThttp://www.shnenglu.com/SpringSnow/archive/2009/12/21/103651.htmlhttp://www.shnenglu.com/SpringSnow/comments/103651.htmlhttp://www.shnenglu.com/SpringSnow/archive/2009/12/21/103651.html#Feedback3http://www.shnenglu.com/SpringSnow/comments/commentRss/103651.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/103651.html
首先感谢默默支持我的人,在这一路寻扄路上Q有q很多挫折,谢谢他们l我的力量,让我挫勇?

其次感谢一ơ次面试中给了我很多帮助的面试官Q其实面试是一个互相学习的ZQ而且每一ơ的肯定都是对能力的一U肯定,l了我很多信心。最后可能由于各U原因,与一些公司擦肩而过Q也衷心愿q些公司的发展越来越好?

最后感谢给了我很多的hQ让我一路坚持梦想的C来?软g开发,是我热爱的一个方向,我也希望能够沿着q条路l走下去?






小q告Q如果你的网l很慢,不妨试试Opera的Turbo加速,不一般的体验啊!

Sandy 2009-12-21 22:29 发表评论
]]>
转: 函数的线E安全和可重?/title><link>http://www.shnenglu.com/SpringSnow/archive/2009/10/22/99202.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 22 Oct 2009 09:33:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2009/10/22/99202.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/99202.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2009/10/22/99202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/99202.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/99202.html</trackback:ping><description><![CDATA[摘自Q?br><a >http://liuaigui.blog.sohu.com/86494742.html</a><br><br>U程安全?Thread-Safe)Q如果一个函数在同一时刻可以被多个线E安全地调用Q就U该函数是线E安全的。线E安全函数解军_个线E调用函数时讉K׃n资源的冲H问题?br><br>可重?Reentrant)Q函数可以由多于一个线Eƈ发用,而不必担心数据错误。可重入函数可以在Q意时刻被中断Q稍后再l箋q行Q不会丢失数据。可重入性解军_数运行结果的定性和可重复性。可重入函数~写规范为:<br>1、不在函数内部用静态或全局数据 <br>2、不q回静态或全局数据Q所有数据都由函数的调用者提供?<br>3、用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据?br>4、如果必访问全局变量Q利用互斥机制来保护全局变量?br>5、不调用不可重入函数?br><br>两者之间的关系Q?br>1、一个函数对于多个线E是可重入的Q则q个函数是线E安全的?br>2、一个函数是U程安全的,但ƈ不一定是可重入的?br>3、可重入性要ZU程安全性?br><br>比如Qstrtok函数是既不可重入的,也不是线E安全的。加锁的strtok不是可重入的Q但U程安全。而strtok_r既是可重入的Q也是线E安全的<br><br>之所以会Lq个问题Q是在考试中遇到过考strtokq个问题是否可用于多U程。自׃使用的角度上感觉不安全,但是I其原因却不是很明白。查了一下,居然涉及到函数的U程安全?br><br>在另一博文中Q是q样解释的:<br>strtok不是一个线E安全的函数。因为根据其定义Q它必须使用内部静态变量来记录字符串中下一个需要解析的标记的当前位|。但是,׃指示q个位置的变量只有一个,那么Q在同一个程序中出现多个解析不同字符串的strtok调用Ӟ各自的字W串的解析就会互相干扰。(摘自Q?<a >http://hi.baidu.com/pigfanfan/blog/item/72816c958d63e743d1135ebf.html</a>Q?br><br>怎么避免呢?<br>我们可以利用另一个函敎ͼstrtok_rQ这个是一个线E安全的函数——strtok_rQ以此来代替strtok?br> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/99202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-10-22 17:33 <a href="http://www.shnenglu.com/SpringSnow/archive/2009/10/22/99202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>? C++ pair用法http://www.shnenglu.com/SpringSnow/archive/2009/10/15/98659.htmlSandySandyThu, 15 Oct 2009 03:09:00 GMThttp://www.shnenglu.com/SpringSnow/archive/2009/10/15/98659.htmlhttp://www.shnenglu.com/SpringSnow/comments/98659.htmlhttp://www.shnenglu.com/SpringSnow/archive/2009/10/15/98659.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/98659.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/98659.html摘自Q?a >http://hi.baidu.com/lucene1983/blog/item/83bb68351d12ffbed1a2d3fe.html

1 pair的应?

pair是将2个数据组合成一个数据,当需要这L需求时可以用pairQ如stl中的map是key和value攑֜一h保存。另一个应用是Q当一个函数需要返?个数据的时候,可以选择pair?pair的实现是一个结构体Q主要的两个成员变量是first second 因ؓ是用struct不是classQ所以可以直接用pair的成员变量?/p>

2 make_pair函数

template pair make_pair(T1 a, T2 b) { return pair(a, b); }

很明显,我们可以使用pair的构造函C可以使用make_pair来生成我们需要的pair?一般make_pair都用在需要pair做参数的位置Q可以直接调用make_pair生成pair对象很方便,代码也很清晰?另一个用的斚w是pair可以接受隐式的类型{换,q样可以获得更高的灵zd。灵zd也带来了一些问题如Q?/p>

std::pair<int, float>(1, 1.1);

std::make_pair(1, 1.1);

是不同的Q第一个就是floatQ而第2个会自己匚w成double?br>
以上是从|上找来的资料,我又查了一下关于pair的定义,其定义是一个模板结构?br>   

        // TEMPLATE STRUCT pair
template<class _Ty1,
    
class _Ty2> struct pair
    
{    // store a pair of values
    typedef pair<_Ty1, _Ty2> _Myt;
    typedef _Ty1 first_type;
    typedef _Ty2 second_type;

    pair()
        : first(_Ty1()), second(_Ty2())
        
{    // construct from defaults
        }


    pair(
const _Ty1& _Val1, const _Ty2& _Val2)
        : first(_Val1), second(_Val2)
        
{    // construct from specified values
        }


    template
<class _Other1,
        
class _Other2>
        pair(
const pair<_Other1, _Other2>& _Right)
        : first(_Right.first), second(_Right.second)
        
{    // construct from compatible pair
        }


    
void swap(_Myt& _Right)
        
{    // exchange contents with _Right
        std::swap(first, _Right.first);
        std::swap(second, _Right.second);
        }


    _Ty1 first;    
// the first stored value
    _Ty2 second;    // the second stored value
    }
;

make_pair同样也是一个模板函数。其定义如下Q?br>
template<class _Ty1,
    
class _Ty2> inline
    pair
<_Ty1, _Ty2> make_pair(_Ty1 _Val1, _Ty2 _Val2)
    
{    // return pair composed from arguments
    return (pair<_Ty1, _Ty2>(_Val1, _Val2));
    }



Sandy 2009-10-15 11:09 发表评论
]]>
虚函C虚承的思?/title><link>http://www.shnenglu.com/SpringSnow/archive/2009/10/07/98048.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 07 Oct 2009 14:43:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2009/10/07/98048.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/98048.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2009/10/07/98048.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/98048.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/98048.html</trackback:ping><description><![CDATA[<p>有这么一个关于虚函数和虚l承的问题,如下Q?br>class A<br>{<br>    char k[3];<br>public:<br>    virtual void aa();<br>};<br><br>class B: public virtual A<br>{<br>    char j[3];<br>public:<br>    virtual void bb();<br>};<br><br>class C: public virtual B<br>{<br>    char i[3];<br>public:<br>   virtual void cc();<br>};<br>请问sizeof(A), sizeof(B), sizeof(C)分别为多?<br><br>对于AQ?我们很清楚的知道Q其大小??br>对于BQ考虑到虚l承和自w的虚函敎ͼ我们也可以算出来起大ؓ8+8+4 = 20<br>对于CQ其大小?0+8+4 = 32?br>其中 4l承所占用的指针?br><br>q个看上L有什么问题。但是当我把虚承去掉以后,q里却有了一些变化?<br>首先Q我猜想了一下,A?QB?6QC?4?br>可惜l果和我想的不一P{案?Q?12Q?16。很有规律的一个数字?br>从A到BQ只增加?。什么原因呢Q?br><br>?a >http://www.diybl.com/course/3_program/c++/cppjs/2007927/74925.html</a>q里介绍了一?/p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>The existence of virtual function(s)<o:p></o:p></font></span></strong></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>Existence of virtual function(s) will add 4 bytes of virtual table pointer in the class, which will be added to size of class. Again, in this case, if the base class of the class already has virtual function(s) either directly or through its base class, then this additional virtual function won't add anything to the size of the class. Virtual table pointer will be common across the class hierarchy. That is<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>class Base { <o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>public:<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri><span style="mso-spacerun: yes"> </span>...<span style="mso-spacerun: yes">         </span><o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>virtual void SomeFunction(...); <o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>private:<span style="mso-spacerun: yes">   </span><o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>int iAMem<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>}; <o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>class Derived : public Base<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>{<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.5"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri><span style="mso-spacerun: yes"> </span>...<span style="mso-spacerun: yes">        </span><o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.5"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri><span style="mso-spacerun: yes"> </span>virtual void SomeOtherFunction(...);<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>private:<span style="mso-spacerun: yes">       </span><o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>int iBMem <o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>};<o:p></o:p></font></span></p> <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt"><font face=Calibri>In the example above, sizeof(Base) will be 8 bytes--that is sizeof(int iAMem) + sizeof(vptr). sizeof(Derived) will be 12 bytes, that is sizeof(int iBMem) + sizeof(Derived). Notice that the existence of virtual functions in class Derived won't add anything more. Now Derived will set the vptr to its own virtual function table.<br><o:p></o:p></font></span></p> <p><br>zcd基类拥有相同的虚函数表?br><br>但似乎虚l承的时候,又摈弃了q一做法?br><br>所以两个是有所区别的?/p> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/98048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-10-07 22:43 <a href="http://www.shnenglu.com/SpringSnow/archive/2009/10/07/98048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>点数在计算Z的存储表C?/title><link>http://www.shnenglu.com/SpringSnow/archive/2009/10/02/97766.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 02 Oct 2009 12:51:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2009/10/02/97766.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/97766.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2009/10/02/97766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/97766.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/97766.html</trackback:ping><description><![CDATA[<p>今天在看面试宝典Q注意到上面所说QҎ在内存里和整数的存储方式不同Q但I竟有何不同呢?<br>在网上搜了一下:<br>?a ><u><font color=#0000ff>http://blog.csdn.net/djsl6071/archive/2007/03/16/1531336.aspx</font></u></a>中介l了点数在内存中的存储方式Q觉得不错,转过来?br><br><strong>点数在内存中的存储方式<br><br></strong>点C存的字节格式如下Q?/p> <p>地址        +0          +1           +2           +3<br>内容    SEEE EEEE   EMMM MMMM    MMMM MMMM    MMMM MMMM</p> <p>q里<br>S 代表W号位,1是负Q?是正<br>E 偏移127的幂Q二q制阶码=(EEEEEEEE)-127?br>M 24位的数保存?3位中Q只存储23位,最高位固定?。此Ҏ用最较少的位数实C<br>较高的有效位敎ͼ提高了精度?/p> <p>零是一个特定|q是0 数也是0?/p> <p>点?12.5作ؓ一个十六进制数0xC1480000保存在存储区中,q个值如下:<br>地址 +0     +1     +2     +3<br>内容0xC1   0x48   0x00   0x00</p> <p>点数和十六q制{效保存g间的转换相当单。下面的例子说明上面的?12.5如何?br>换?br>点保存g是一个直接的格式Q要转换Z个QҎQ位必须按上面的点C存格式表<br>所列的那样分开Q例如:</p> <p>地址       +0           +1            +2            +3<br>格式   SEEE EEEE    EMMM MMMM     MMMM MMMM     MMMM MMMM<br>二进?nbsp; 11000001     01001000      00000000      00000000<br>十六q制   C1           48            00            00</p> <p>从这个例子可以得C面的信息Q?br>  W号位是1 表示一个负?br>  q是二进?0000010或十q制130Q?30减去127?Q就是实际的q?br>  数是后面的二进制数10010000000000000000000<br>在尾数的左边有一个省略的数点和1,q个1在QҎ的保存中l常省略,加上一?和小?br>点到数的开?得到数值如?<br>1.10010000000000000000000</p> <p>接着,Ҏ指数调整数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因ؓ<br>指数?,数调整如下:<br>1100.10000000000000000000</p> <p>l果是一个二q制点敎ͼ数点左边的二进制数代表所处位|的2的幂Q例如:1100表示<br>(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12?br>数点的双也代表所处位|的2的幂Q只是幂是负的。例如:.100...表示(1*2^(-1))+<br>(0*2^(-2))+(0*2^(-2))...=0.5?br>q些值的和是12.5。因|的W号位表C数是负的Q因此十六进制?xC1480000表示-<br>12.5?br><br>关于多字节数据类型在内存中的存储问题</p> <p><br>int ,short 分别??字节。他们在内存中的存储方式下面举个例子说明?/p> <p>int data = 0xf4f3f2f1;<br>其中低位存放在编址的内存单元Q高位存攑֜~址高的内存单元<br>如下Q?br>地址Q?x8000      0x8001    0x8002   0x8003<br>数据Q?nbsp;  f1              f2            f3          f4<br>ҎIEEE?985q制定的标准来处理QҎ<br>单精度QҎ?字节Q包?位符号位s(整数?Q负Cؓ1)Q?位指CeQ?3位有效位f<br>点型用的是科学计数法Q比如十q制?2345可以表示?.2345 * 10^4(表示10?ơ幂)<br>用二q制表示?1.1000000111001 * 2^13<br>所以计机中用点数表C?2345q个十进制应该是q样的,s位ؓ0Q因为是正数Q指C?3+127=140(127为单_ֺ点数偏Ud|Z表示只有数部分的数)Q有效位?000000111001<br>计算的时候用 (-1)^s * 1.f * 2^(e-127) Q结果就?1* 1.1000000111001 * 2^(140-127=13) Q和我们刚才表示的一?br>q比如,十进制小?.125转换Zq制数0.001可以表示?1* 1.0 * 2^(124-127=-3)<br>doubleQ双_ֺ点数有1位符号位?1位指C?2位有效数<br>谢谢Q和我找的资料差不多Q)<br>知道公式<br>n=(-1)^s*m*2^e<br>e=|E|-bias<br>bias = 2^(k-1)-1(k为E的位敎ͼ<br>m=|1.M|</p> <p><br>知道12345在内存中?0q制表示以后<br>0x4640e400 = 0(100 0110 0)<100 0000 1110 0100 0000><br>括号中的数字为|E| Q?140 所以eQ?40Q?27Q?3<br>括号中的数字ؓm=|1.M|Q|1.100000011100100|=1.506958008<br>ok,<br>代入公式n = (-1)^0*1.506958008*2^13=12345<br>完工Q!</p> <p> </p> <p>本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/edivista/archive/2009/06/07/4248794.aspx</a></p> <p> </p> <p><strong>本文来自CSDN博客Q{载请标明出处Q?/strong><a ><strong>http://blog.csdn.net/edivista/archive/2009/06/07/4248794.aspx</strong></a><br><br></p> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/97766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-10-02 20:51 <a href="http://www.shnenglu.com/SpringSnow/archive/2009/10/02/97766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dll学习http://www.shnenglu.com/SpringSnow/archive/2009/10/02/97760.htmlSandySandyFri, 02 Oct 2009 08:43:00 GMThttp://www.shnenglu.com/SpringSnow/archive/2009/10/02/97760.htmlhttp://www.shnenglu.com/SpringSnow/comments/97760.htmlhttp://www.shnenglu.com/SpringSnow/archive/2009/10/02/97760.html#Feedback0http://www.shnenglu.com/SpringSnow/comments/commentRss/97760.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/97760.html        DLL, 动态链接库, Dynamic-link library.一直以来都是Windows操作pȝ的基矟뀂Window应用E序~程接口提供的所有函数都包含在DLL中。其中三个最重要的DLL分别是Kernel32.dllQUser32.dllQGDI32.dll。Kernel32.dll Q包含的函数用来理内存、进E以及线E;User32.dll包含的函数用来执行与用户界面相关的Q务,如创建窗口和发送消息。GDI32.dllQ包含的函数用来l制囑փ和显C文字。Windows Mobile中重要的DLL是Coredll.dll.

         Windowspȝq泛使用DLLQ那么我们用DLL的理由是什么?下面是在《Windows 核心~程中》摘录的一部分Q?br>         一是扩展了应用E序的特性;
          二是化了目的管理;
          三是有助于节省内存;
          四是促进了资源的׃nQ?br>          五是促进了本地化Q?br>         六是有助于解军_^台间的差异;
         七是可以用于Ҏ目的?nbsp;
         目前用到的地方在 节省内存、资源共享、本地化、特D目的。这几个是我在项目中见过的。DLL如何使用呢?一般有两种ҎQ一是隐式蝲入时链接(implicit load-time linking)和显C行时链接Qexplicit run-time linkingQ?br>         隐式链接Q常用的Ҏ是将DLL的头文g和LIB文g包含到执行文件程序中Q相应DLL攑ֈ执行文g对应的目录。基本就OK了?br>          例如Q?br>           DLL为MyLib.dllQ其头文件ؓMyLib.h, LIB文g为MyLib.lib?br>           我们在执行文件中使用是,需要做如下操作Q?br>           #include "MyLib.h"
           #pragma comment(lib, "MyLib.lib")

           卛_实现隐式调用Q变量、函数、类可实现调用?br>           q里lib文g非常,它ƈ不包含Q何函数或变量Q它只是列出了所有被导出的函数和变量的变量名Q具体的实现在dll文g中。编译阶D不包含Lib文g会出错的?br>         昄链接Q在应用E序q行的过E中Q显C地载入所需的DLL?br>         一般可以用LoadLibrary和FreeLibrary来实现加载和卸蝲DLL。那么如何判断一个DLL是否已经被映到了进E的地址I间中?我们可以使用GetModuleHandle.
          ?
           HMODULE hInstDll = GetModuleHandle(TEXT("MyLib"));
           if (hInstDll == NULL)
           {
                hInstDll = LoadLibrary(TEXT("MyLib"));
            }
           我们已经知道如何昄加蝲DLLQ那如何昄调用其中的变量、函数、类呢?
          例如在DLL中,我们有一个变?g_nResult, 函数AddQ我们在执行E序中如何调用呢Q可以利用GetProcAddress?br>           对于变量Q?br>           int nResult =*(int*)GetProcAddress(hInstDll, "g_nResult");
           对于函数Q?br>            typedef   int   (*FUNC)(int, int); 
            FUNC pfn = (FUNC)GetProcAddress(hInstDll, "Add");

           q是今天学习到的关于DLL的一点知识?br>            



Sandy 2009-10-02 16:43 发表评论
]]>
c++学习——More Effective C++ 基础议题?/title><link>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96936.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 22 Sep 2009 05:33:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96936.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/96936.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/96936.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/96936.html</trackback:ping><description><![CDATA[条款?避免不必要的默认构造函?br><br>默认构造函敎ͼ指没有参数的构造函敎ͼ是指C++语言中,你不用传参数可以调用的构造函数。构造函数用于初始化对象Q而默认构造函数可以在不依赖Q何外部信息的情况下创建对象?br><br>在一个完的世界里,无需M外部信息卛_创徏对象的类可以包含默认构造函敎ͼ而需要额外信息来创徏对象的类则不包含默认构造函数。可是我们的世界是不完美的,所以我们必一些额外的因素考虑在内。特别地Q如果一个类没有默认构造函敎ͼ使用q个cȝ时候就会有一些限制?br><br>没有默认构造函敎ͼ在三U情况下它的应用可能会出现问题:<br>W一个问题是创徏数组的时候,通常没有很好的办法可以指定数l元素的构造函数的参数?br>W二个问题是没有默认构造函数的cM们无法作多基于模板的容器cȝcd参数使用。因为通常用于实例化模板的哪些cd需要提供默认构造函数?br>W三个问题是在有虚基cȝ时候应该提供默认构造函数还是不提供默认构造函数。没有默认构造函数的虚基cM用v来很痛苦Q这是因基类的构造函数所要求的参数必ȝ创徏对象所属的最q的zcL提供?br><br>正因些强加于没有默认构造函数的cM的重中限Ӟ一些h认ؓ所有的c都应该有默认构造函敎ͼ即默认构造函数没有够的信息来完全初始化一个对象?br><br>但是默认构造函C影响cȝq行效率Q有时会使其他成员函数变得复杂?br><br>如果一个类的构造函数能够确保所有的数据成员被正初始化Q就能避免付Z些代仗通常默认构造函C提供q些保证。如果默认构造函数对于某些类没有太大意义Q最好避免用他们。这l用这U类加了一些限Ӟ但是当你使用它时Q它可以向你保证你能很放心地怿q个c被正确得初始化Qƈ且具有高效的效率?br><br>说实话,q一章节我看得不是很明白?br>作者在一开始,列D了一些没有默认构造函数我们可能遇到的问题Q在q些问题下,q而得出默认构造函数所带来的一些效率和代h困扰。看来还需要在实践中仔l揣摩揣摩?br><br><br><br> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/96936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-09-22 13:33 <a href="http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++学习——More Effective C++ 基础议题?/title><link>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96922.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 22 Sep 2009 03:57:00 GMT</pubDate><guid>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96922.html</guid><wfw:comment>http://www.shnenglu.com/SpringSnow/comments/96922.html</wfw:comment><comments>http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/SpringSnow/comments/commentRss/96922.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/SpringSnow/services/trackbacks/96922.html</trackback:ping><description><![CDATA[<p>条款?l不要把多态应用于数组<br><br>l承的一大特性是Q允怽通过指向基类的指针和引用来操U|生类对象。也允许通过基类指针和引用来操纵zcLl?br><br>但是用基cL针操U一个包含派生类对象的数l,׃发生各种个样的问题,其结果往往是不定的?br><br>我根据书中的例子Q写了一个小E序Q?br></p> <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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BST<br><img id=Codehighlighter1_53_93_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_93_Open_Text.style.display='none'; Codehighlighter1_53_93_Closed_Image.style.display='inline'; Codehighlighter1_53_93_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_53_93_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_93_Closed_Text.style.display='none'; Codehighlighter1_53_93_Open_Image.style.display='inline'; Codehighlighter1_53_93_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_53_93_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_53_93_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    BST()<br><img id=Codehighlighter1_71_83_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_83_Open_Text.style.display='none'; Codehighlighter1_71_83_Closed_Image.style.display='inline'; Codehighlighter1_71_83_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_71_83_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_83_Closed_Text.style.display='none'; Codehighlighter1_71_83_Open_Image.style.display='inline'; Codehighlighter1_71_83_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span id=Codehighlighter1_71_83_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_71_83_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BalancedBST: </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> BST<br><img id=Codehighlighter1_127_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_127_146_Open_Text.style.display='none'; Codehighlighter1_127_146_Closed_Image.style.display='inline'; Codehighlighter1_127_146_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_127_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_127_146_Closed_Text.style.display='none'; Codehighlighter1_127_146_Open_Image.style.display='inline'; Codehighlighter1_127_146_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_127_146_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_127_146_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> j;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> printBSTArray(ostream</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> BST arr[], </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> numElements)<br><img id=Codehighlighter1_217_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_217_291_Open_Text.style.display='none'; Codehighlighter1_217_291_Closed_Image.style.display='inline'; Codehighlighter1_217_291_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_217_291_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_217_291_Closed_Text.style.display='none'; Codehighlighter1_217_291_Open_Image.style.display='inline'; Codehighlighter1_217_291_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_217_291_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_217_291_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> numElements; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_259_289_Open_Image onclick="this.style.display='none'; Codehighlighter1_259_289_Open_Text.style.display='none'; Codehighlighter1_259_289_Closed_Image.style.display='inline'; Codehighlighter1_259_289_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_259_289_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_259_289_Closed_Text.style.display='none'; Codehighlighter1_259_289_Open_Image.style.display='inline'; Codehighlighter1_259_289_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span id=Codehighlighter1_259_289_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_259_289_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        </span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> arr[i].i </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> endl;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main()<br><img id=Codehighlighter1_305_513_Open_Image onclick="this.style.display='none'; Codehighlighter1_305_513_Open_Text.style.display='none'; Codehighlighter1_305_513_Closed_Image.style.display='inline'; Codehighlighter1_305_513_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_305_513_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_305_513_Closed_Text.style.display='none'; Codehighlighter1_305_513_Open_Image.style.display='inline'; Codehighlighter1_305_513_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_305_513_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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_305_513_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BST<img src="http://www.shnenglu.com/Images/dot.gif">.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    BST BSTArray[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    printBSTArray(cout, BSTArray, </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BalancedBST<img src="http://www.shnenglu.com/Images/dot.gif">.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    BalancedBST bBSTArray[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    printBSTArray(cout, bBSTArray, </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <p><br>其结果如下:<br><br>  <img height=435 alt="" src="http://www.shnenglu.com/images/cppblog_com/springsnow/6.jpg" width=663 border=0><br><br> 可以看到E序q不如我们所期望的那Pq说明什么呢Q?br> arr[i],表示的是*Qarr+iQ?但是arr+i所指向的地址偏离arr所指向的地址是i*(an object in the array)?br>因ؓ参数被声明ؓBST数组cdQ那么数l的每个元素必须是BSTQ那么它们的间隔也毕定是i*sizeof(BST)。如果传入BalancedBST数组Q编译器可能׃犯错误,在这U情况下Q编译器׃假定数组里每个对象的大小都和BST的大一栗而通常zc要比基cL更多的成员变量,所以派生类一般都比基cd象大。所以我们就看到了如上的l果?br><br> 试图通过一个基cL针删除一个包含派生类对象的数l,也会有同L问题?br><br>所以不要把多台应用到数l上Q还是很有好处的?/p> <img src ="http://www.shnenglu.com/SpringSnow/aggbug/96922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/SpringSnow/" target="_blank">Sandy</a> 2009-09-22 11:57 <a href="http://www.shnenglu.com/SpringSnow/archive/2009/09/22/96922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MoveFile、CopyFile和DeleteAndRenameFilehttp://www.shnenglu.com/SpringSnow/archive/2009/09/17/96494.htmlSandySandyThu, 17 Sep 2009 01:38:00 GMThttp://www.shnenglu.com/SpringSnow/archive/2009/09/17/96494.htmlhttp://www.shnenglu.com/SpringSnow/comments/96494.htmlhttp://www.shnenglu.com/SpringSnow/archive/2009/09/17/96494.html#Feedback3http://www.shnenglu.com/SpringSnow/comments/commentRss/96494.htmlhttp://www.shnenglu.com/SpringSnow/services/trackbacks/96494.html昨天惛_q么一个操作,是文件从一个文件夹拯到另一个文件夹中,同时删除源文件夹中的内容。想着挺简单的Q于是就首先使用了MoveFile?br>当目的文件夹中,不存在文件时QMoveFile成功。而当目的文g夹包含该文gӞMoveFile则调用不成功。他不支持覆盖。所以挪动文Ӟ用MoveFileg不是首选?br>此时Q我惛_的是DeleteAndRenameFileQ?br>在SDK中解释到This function deletes the source file after it copies the content of the source file to the destination file. 拯源文件的内容到目的文Ӟ然后删除源文件。看似符合要求,但是他要求调用该函数的时候目的文件必d在?br>
q两个函数都不可行,l合h到是不错的选择Q可以满求。可惜我昨天没有q么惻I昨天我想CCopyFile?br>CopyFile的原型是
BOOL CopyFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName,
  BOOL bFailIfExists
);

最后一个参数表C当目的文g已经存在的时候,CopyFile调用成功q是p|的操作。如果ؓFalseQ就可以覆盖拯了?br>
于是我就自己写了一个CopyAndDel的小函数。先拯再删除原来的文g。删除文件的时候还需要考虑一下文件属性的问题?br>

BOOL CopyAndDel(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName)
{
    
if (CopyFile(lpExistingFileName, lpNewFileName, FALSE))
    
{
        
if (!DeleteFile(lpExistingFileName))
        
{
            SetFileAttributes(lpExistingFileName, FILE_ATTRIBUTE_NORMAL);
            
return DeleteFile(lpExistingFileName);
        }

        
return TRUE;
    }

    
return FALSE;
}


q个函数的~陷在于q需要考虑删除文g的属性问题。似乎利用MoveFile和DeleteAndRenameFilel合更好一些?br>
q里ȝ一下:
MoveFile 重命名一个文件或目录Q包括它所有的孩子。可Ҏ件夹q行操作。不q需要保证的是新文g或新文g夹不存在Q否则调用失败?br>DeleteAndRenameFile 当拷贝源文g的内容到目的文g后,删除源文件。需要保证目的文件在调用前已l存在?br>CopyFile 拯一个已l存在的文gQƈ生成一个新的文件。不能对文g夹进行操作?br>DeleteFile 删除一个文件。不能删除文件夹。该函数删除p|的时候,考虑一下文件的属性问题?br>RemoveDirectory 删除一个空的文件夹?br>
 



Sandy 2009-09-17 09:38 发表评论
]]>
þþþƷ鶹| þĻ| ھƷþþĻ| þһձɫۺϾþ| ĻƷѾþþ| þ99Ʒ99þ6| þרƷ| ˾þۺӰԺ| 97Ʒ˾þô߽app| þþƷһ| þ91Ʒ91| ۲ӰԺþþƷ| AVþþƷ| 99þù޸ۿ2024| ˾ƷۺϾþþ| ޹þþþþþ| ޹Ʒþ| þþþþƷĻ| ݹƷþþþþ| ޾Ʒtvþþþþþþþ| 99þþþƷ| Ʒ޾þþþþ888| 99þۺϹƷ | ݹƷþþþ| þAV| þþþһƷ| þþþۺþ| 97þþƷҹһ| ݺɫɫݺݺۺϾþ| þݺҹҹ2020| ھƷþþþӰԺվ| ƷƵþ| ھƷ˾þþþ| þùѾƷ| þþþþþþƷɫ| þþþ99ƷƬţţӰ| þ99Ʒ| 99þѹۺϾƷ| AVݺɫۺϾþ| þѾƷһ| 99þþþ|