﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-老大不伤悲</title><link>http://www.cppblog.com/FandyM/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:11:29 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:11:29 GMT</pubDate><ttl>60</ttl><item><title>转 MSYS&amp;MINGW环境中编译mediastream2和ortp</title><link>http://www.cppblog.com/FandyM/archive/2011/08/04/152435.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Thu, 04 Aug 2011 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2011/08/04/152435.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/152435.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2011/08/04/152435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/152435.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/152435.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><h2><span style="font-weight: normal; font-size: 14px;">（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装intltool：访问http://ftp.acc.umu.se/pub/GNOME/binaries/win32/intltool/0.40/并下载intltool_0.40.4-1_win32.zip，解压到c:\msys目录下；</span></h2> <p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装linphone-deps：访问http://download.savannah.gnu.org/releases- noredirect/linphone/misc/并下载linphone-deps-win32-091203.zip，解压到c:\msys目录 下；</p> <p>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装gtk+：访问http://www.gtk.org/download-windows.html，下载pkg-config_0.23-3_win32.zip和glib_2.24.0-2_win32.zip，解压到c:\msys目录下；</p> <p>（4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译libSRTP：</p> <ol><li>访问http://sourceforge.net/projects/srtp/并下载srtp-1.4.4.tgz，并解压到c:\msys\src目录下（也可以是其它目录）；</li><li>运行c:\msys\msys.bat，执行以下命令，</li></ol> <p>cd /src/srtp</p> <p>autoconf</p> <p>./configure&#8211;prefix=/usr</p> <p>make</p> <p>make install</p> <p>make clean</p> <p>（5）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译ortp：</p> <ol><li>访问http://download.savannah.gnu.org/releases-noredirect/linphone/ortp/sources/并下载ortp-0.16.3.tar.gz，解压到c:\msys\src目录下（也可以是其它目录）；</li><li>运行c:\msys\msys.bat，执行以下命令，</li></ol> <p>cd /src/ortp-0.16.3</p> <p>autoconf</p> <p>./configure&#8211;prefix=/usr</p> <p>make</p> <p>make install</p> <p>make clean</p> <p>（6）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译mediastreamer2：</p> <ol><li>访问http://download.savannah.gnu.org/releases-noredirect/linphone/mediastreamer/并下载mediastreamer-2.5.0.tar.gz，解压到c:\msys\src目录下（也可以是其它目录）；</li><li>运行c:\msys\msys.bat，执行以下命令，</li></ol> <p>cd /src/mediastreamer-2.5.0</p> <p>autoconf</p> <p>./configure&#8211;prefix=/usr</p> <p>make</p> <p>make install</p> <p>make clean</p> <p>（7）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建lib文件供VC++使用：运行c:\msys\msys.bat，执行以下命令，</p> <p>cd /lib</p> <p>cp../src/mediastream-2.5.0/build/win32native/mediastreamer2.def mediastreamer.def</p> <p>cp ../src/ortp-0.16.3/build/win32native/ortp.def ortp.def</p> <p>cp../bin/libortp-8.dll .</p> <p>cp../bin/libmediastreamer-0.dll .<br /></p> <p>dlltool &#8211;Dlibortp-8.dll &#8211;d ortp.def &#8211;l ortp.lib <br /></p><p><span style="color: red;">(为支持linphone media engine 需要在ortp.def文件添加如下代码：</span></p><p><div><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_pcmu8000</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_pcma8000</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_pcm8000</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_l16_mono</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_l16_stereo</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_lpc1016</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_g729</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_g7231</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_g7221</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_g726_40</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_speex_nb</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_speex_wb</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_speex_uwb</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_ilbc</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; payload_type_telephone_event</span><br /><span style="color: red;">&nbsp;&nbsp;&nbsp; av_profile</span></div><span style="color: red;">)</span></p> <p> dlltool &#8211;Dlibmediastreamer-0.dll.a &#8211;d mediastreamer.def &#8211;l mediastreamer.lib</p></div></div>原帖<div>http://www.cnblogs.com/joiner/archive/2010/06/18/1759943.html</div><img src ="http://www.cppblog.com/FandyM/aggbug/152435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2011-08-04 13:32 <a href="http://www.cppblog.com/FandyM/archive/2011/08/04/152435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 MinGW&amp;MSYS的手工安装</title><link>http://www.cppblog.com/FandyM/archive/2011/08/04/152434.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Thu, 04 Aug 2011 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2011/08/04/152434.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/152434.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2011/08/04/152434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/152434.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/152434.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><p>本节所需的程序包如未特别注明，都是从<a href="http://sourceforge.net/downloads/mingw/">http://sourceforge.net/downloads/mingw/</a>下载，本节下文称之为&#8220;下载站点&#8221;。</p> <p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建立程序目录：在c盘建立msys目录，并在msys目录下建立mingw子目录；</p> <p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装MinGW：访问下载站点，</p> <ol><li>浏览MinGW-&gt;BaseSystem-&gt;GNU-Binutils-&gt;binutils-2.20.51，下载binutils-2.20.51-1-mingw32-bin.tar.lzma；</li><li>浏览MinGW-&gt;BaseSystem-&gt;RuntimeLibrary-&gt;MinGW-RT-&gt;mingwrt- 3.18，下载mingwrt-3.18-mingw32-dev.tar.gz和mingwrt-3.18-mingw32-dll.tar.gz；<span style="color: red;">（如果在编译程序的时候，出现undefined reference to __dyn_tls_init_callback 链接错误时，可以换一个版本低一些的）</span></li><li>浏览MinGW-&gt;BaseSystem-&gt;RuntimeLibrary-&gt;Win32-API w32api-3.14，下载w32api-3.14-mingw32-dev.tar.gz；</li><li>浏览MinGW-&gt;BaseSystem-&gt;GCC Version4-&gt;gcc-4.5.0-1， 下载gcc-c++-4.5.0-1-mingw32-bin.tar.lzma、gcc-core-4.5.0-1-mingw32- bin.tar.lzma、libgcc-4.5.0-1-mingw32-dll-1.tar.lzma和libstdc++-4.5.0-1- mingw32-dll-6.tar.lzma；</li><li>浏览MinGW-&gt;mpfr-&gt;mpfr-2.4.1-1，下载libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma；</li><li>浏览MinGW-&gt;gmp-&gt;gmp-5.0.1-1，下载libgmp-5.0.1-1-mingw32-dll-10.tar.lzma；</li><li>浏览MinGW-&gt;mpc-&gt;mpc-0.8.1-1，下载libmpc-0.8.1-1-mingw32-dll-2.tar.lzma；</li><li>浏览MinGW-&gt;pthread-w32-&gt;pthread-w32-2.8.0-3，下载pthreads-w32-2.8.0-3-mingw32-dev.tar.lzma；</li><li>将以上所下载的压缩包解压缩到c:\msys\mingw目录下；</li></ol> <p>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装MSYS，访问下载站点，</p> <ol><li>浏览MSYS-&gt;BaseSystem-&gt;msys-1.0.14-1，下载msysCORE-1.0.14-1-msys-1.0.14-bin.tar.lzma；</li><li>浏览MSYS-&gt;coreutils-&gt;coreutils-5.97-3，下载coreutils-5.97-3-msys-1.0.13-bin.tar.lzma和coreutils-5.97-3-msys-1.0.13-ext.tar.lzma；</li><li>浏览MSYS-&gt;automake-1.11.1-1，下载automake-1.11.1-1-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;autoconf-&gt;autoconf-2.65-1，下载autoconf-2.65-1-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;libtool-&gt;libtool-2.2.7a-2，下载libtool-2.2.7a-2-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;crypt-&gt;crypt-1.1_1-3，下载crypt-1.1_1-3-msys-1.0.13-bin.tar.lzma和libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma；</li><li>浏览MSYS-&gt;perl-&gt;perl-5.6.1_2-2，下载perl-5.6.1_2-2-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;gettext-&gt;gettext-0.17-2，下载gettext-0.17-2-msys-1.0.13-bin.tar.lzma、 gettext-0.17-2-msys-1.0.13-ext.tar.lzma、gettext-0.17-2-msys-1.0.13- dev.tar.lzma和libintl-0.17-2-msys-dll-8.tar.lzma；</li><li>浏览MSYS-&gt;bash-&gt;bash-3.1.17-3，下载bash-3.1.17-3-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;regex-&gt;regex-1.20090805-2，下载libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma；</li><li>浏览MSYS&#224;termcap&#224;termcap&#224;0.20050421_1-2，下载libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma；</li><li>浏览MSYS-&gt;sed-&gt;sed-4.2.1-2，下载sed-4.2.1-2-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;libicon-&gt;libiconv-1.13.1-2，下载libiconv-1.13.1-2-msys-1.0.13-dll-2.tar.lzma；</li><li>浏览MSYS-&gt;make-&gt;make-3.81-3，下载make-3.81-3-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;gawk-&gt;gawk-3.1.7-2，下载gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;grep-&gt;grep-2.5.4-2，下载grep-2.5.4-2-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;diffutils-&gt;diffutils-2.8.7.20071206cvs-3，下载diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;openssl-&gt;openssl-1.0.0-1，下载libopenssl-1.0.0-1-msys-1.0.13-dev.tar.lzma；</li><li>浏览MSYS-&gt;tar-&gt;tar-1.23-1，下载tar-1.23-1-msys-1.0.13-bin.tar.lzma；</li><li>浏览MSYS-&gt;m4-&gt;m4-1.4.14-1，下m4-1.4.14-1-msys-1.0.13-bin.tar.lzma；</li><li>将以上所下载的程序包解压到c:\msys目录下；</li><li>创建fstab文件：在c:\msys\etc目录下创建文件fstab，并增加如下内容，</li></ol> <p>c:/msys/mingw&nbsp;&nbsp;&nbsp; /mingw</p> <p> 测试基本环境：运行c:\msys\msys.bat，进入命令行界面执行gcc &#8211;version，确认基本环境已安装好；</p><p>源贴<div>http://www.cnblogs.com/joiner/archive/2010/06/18/1759941.html</div><br /></p></div></div><img src ="http://www.cppblog.com/FandyM/aggbug/152434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2011-08-04 13:28 <a href="http://www.cppblog.com/FandyM/archive/2011/08/04/152434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近研究libjingle的经验总结</title><link>http://www.cppblog.com/FandyM/archive/2011/08/04/152427.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Thu, 04 Aug 2011 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2011/08/04/152427.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/152427.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2011/08/04/152427.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/152427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/152427.html</trackback:ping><description><![CDATA[最近有一个语言项目方面的调研，需要评估一下libjingle，所以研究了半个月的libjingle，现在把经验总结如下（如有不对，请不吝赐教）：<br />1、libjingle库所带例子只支持rtpdump文件传递语音，不支持实时语音通话；<br />2、最新的几个版本的libjingle库去掉了GIPS voiceEngine的相关部分（可能是因为google收购了GIPS）；<br />3、那么在windows下要支持实时语音通话，可以用linphone media engine，不过这个库是linux下的，所以迁移过来会费不少精力（不知有没有更好的方法）：<br />要想在windows下用linphone media engine， 首先，按照README的说明添加如下代码：<br /><div>Add the following lines into the libjingle.scons file.<br />&nbsp;&nbsp;&nbsp; In the "talk.Library(env, name = "libjingle",..." section, you need to add:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HAVE_LINPHONE",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HAVE_SPEEX",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "HAVE_ILBC",<br />&nbsp;&nbsp;&nbsp; to the "cppdefines = [".<br />&nbsp;&nbsp;&nbsp; add:<br /><div> &nbsp;&nbsp;&nbsp;&nbsp; "session/phone/linphonemediaengine.cc",</div>&nbsp;&nbsp;&nbsp; to the "srcs = [ ..."<br /><br />&nbsp;&nbsp;&nbsp; add:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "third_party/mediastreamer/include",<br /><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "third_party/ortp/include"</div>&nbsp;&nbsp;&nbsp; to the "includedirs = [ ..."<br /><br />&nbsp;&nbsp;&nbsp; In the "talk.App(env, name = "call",..." section, you need to add:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "ortp"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "mediastreamer",<br />&nbsp;&nbsp;&nbsp; to the "libs = [".<br />&nbsp;<br />然后，<br />访问http://download.savannah.gnu.org/releases-noredirect/linphone/ortp/sources/下载ortp代码，<br /><div>访问http://download.savannah.gnu.org/releases-noredirect/linphone/mediastreamer/下载mediastreamer，</div>并复制到libjingle库的third_party中，文件夹名需与上一步添加的路径名一致。<br /><br />在windows下需要dll，所以还得编译两个库的dll，方法转自：<br /><div>http://www.cnblogs.com/joiner/archive/2010/06/18/1759941.html Mingw&amp;msys的手动安装；<br /><div>http://www.cnblogs.com/joiner/archive/2010/06/18/1759943.html Mingw&amp;msys环境中编译mediastreamer2和ortp。<br />接着，<br />copy .lib文件到talk\build\dbg\lib目录，<br />copy .dll到talk\build\dbg\staging目录。<br /><br />然后，修改libjingle库的socketaddress.cc里的一个bug，参考http://mysuperbaby.iteye.com/blog/910830<br />增加红色，解决域名转IP的问题：<br /><div>bool SocketAddress::StringToIP(const std::string&amp; hostname, uint32* ip) {<br />&nbsp; in_addr addr;<br />&nbsp; <span style="color: red;">struct hostent *host;</span><br /><span style="color: red;">&nbsp; if (isalpha(hostname.c_str()[0]))</span><br /><span style="color: red;">&nbsp; {</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;host = gethostbyname(hostname.c_str());</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (host == NULL)</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("gethostbyname error\n");</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;memcpy(&amp;addr.s_addr,&nbsp;&nbsp; host-&gt;h_addr_list[0],host-&gt;h_length);</span><br /><span style="color: red;">&nbsp; }</span><br /><span style="color: red;">&nbsp; else</span> if (inet_aton(hostname.c_str(), &amp;addr) == 0)<br />&nbsp; { &nbsp;<br />&nbsp; &nbsp;&nbsp; &nbsp;return false;<br />&nbsp; }<br />&nbsp; *ip = NetworkToHost32(addr.s_addr);<br />&nbsp; return true;<br />}</div><br />按照README的方法，编译。<br /><br />通过后运行call.exe，与Gtalk通话。<br /><br />如果音质不好，断断续续，可以在mingw&amp;msys下，<div>移除 winsnd2.c 添加winsnd3.c 重新编译ortp库。<br /><br />还有就是关于receiving RTCP packet： Connection reset by peer. 参考http://mysuperbaby.iteye.com/blog/911159</div>这篇文章，也没有解决，不过不影响音质。</div></div></div><img src ="http://www.cppblog.com/FandyM/aggbug/152427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2011-08-04 11:59 <a href="http://www.cppblog.com/FandyM/archive/2011/08/04/152427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近笔试面试集锦(c/c++)</title><link>http://www.cppblog.com/FandyM/archive/2011/04/24/144910.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Sun, 24 Apr 2011 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2011/04/24/144910.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/144910.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2011/04/24/144910.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/144910.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/144910.html</trackback:ping><description><![CDATA[最近在找工作，把遇到的笔试、面试题记录在此，总结经验教训，为后面的笔试、面试打好基础。<br>闲话少叙，看题：<br>1、<br>声明以下变量（简单的就不列了，列我觉得稍微有点难度的吧）<br>a、指向整型的指针的指针的数组： int **p[];<br>b、指向数据的指针： int (*p)[];<br>c、参数为void，返回值为void的函数数组：void （*p[])();<br><br>2、下列代码输出什么？<br>int a = -5；<br>unsigned int b = 1;<br>b &gt; a ? cout &lt;&lt; b : cout &lt;&lt; a ;<br>输出 -5 ，因为算术转化把int提升为unsigned int。<br><br>3、下列代码输出什么？<br>int a = 1;<br>int b = 2;<br>int c = a+++b;<br>cout &lt;&lt; "a=" &lt;&lt; a &lt;&lt; " b=" &lt;&lt; b &lt;&lt; " c=" &lt;&lt; c;<br>a=2 b=2 c=3;<br>优先级后置++ &gt; 前置++ &gt; + ;NC题，那个写代码的时候不会加个括号。<br><br>4、实现下列运算<br>1-2+3-4+5-6+7-8+9<br>方法1：<br>int sum = 0;<br>for (int i=1; i&lt;10; i++) {<br>&nbsp;&nbsp;&nbsp; if (i % 2) {<br>&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; sum += i; &nbsp; <br>&nbsp;&nbsp;&nbsp; } else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum -= i;<br>&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;<br>方法2：<br>int sum = 0;<br>int flag = -1;<br>for (int i=1; i&lt;10; i++) {<br>&nbsp;&nbsp;&nbsp; flag *= -1;<br>&nbsp;&nbsp;&nbsp; sum += flag * i;<br>}<br><br>答题的时候写了两种，以为方法2的效率高，不过回来加大循环量后，发现方法1快些，两次乘法比一次求余慢。<br><br>5、memcpy是，目标内存与源内存有重叠是怎么copy？<br>可以从后往前拷。<br><br>未完待续<br><br><br>     <img src ="http://www.cppblog.com/FandyM/aggbug/144910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2011-04-24 20:06 <a href="http://www.cppblog.com/FandyM/archive/2011/04/24/144910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc 创建Dll</title><link>http://www.cppblog.com/FandyM/archive/2010/08/29/125130.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Sun, 29 Aug 2010 02:12:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2010/08/29/125130.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/125130.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2010/08/29/125130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/125130.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/125130.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:usefelayout/>
</w:compatibility>
<w:browserlevel>MicrosoftInternetExplorer4</w:browserlevel>
</w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" latentstylecount="156">
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:2106343930;
mso-list-type:hybrid;
mso-list-template-ids:1925608002 -1430880734 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:"\(%1\)";
mso-level-tab-stop:20.25pt;
mso-level-number-position:left;
margin-left:20.25pt;
text-indent:-20.25pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;" lang="EN-US">DLL(Dynamic
Linkable Library)</span><span style="font-family: 宋体;">可以<span lang="EN-US"></span>看成一些可以直接拿来用的变量、函数或类的集合。在库的发展史上经历了&#8220;无库－静态链接库－动态链接库&#8221;的时代。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　静态链接库与动态链接库都是共享代码的方式，如果采用静态链接库，则无论你愿不愿意，<span lang="EN-US">lib</span>中的指令都被直接包含在最终生成的<span lang="EN-US">EXE</span>文件中了。但是若使用<span lang="EN-US">DLL</span>，该<span lang="EN-US">DLL</span>不必被包含在最终<span lang="EN-US">EXE</span>文件中，<span lang="EN-US">EXE</span>文件执行时可以&#8220;动态&#8221;地引用和卸载这个与<span lang="EN-US">EXE</span>独立的<span lang="EN-US">DLL</span>文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库，而在动态链接库中还可以再包含其他的动态或静态链接库。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　对动态链接库，我们还需建立如下概念：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　（<span lang="EN-US">1</span>）<span lang="EN-US">DLL </span>的编制与具体的编程语言及编译器无关<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　只要遵循约定的<span lang="EN-US">DLL</span>接口规范和调用方式，用各种语言编写的<span lang="EN-US">DLL</span>都可以相互调用。譬如<span lang="EN-US">Windows</span>提供的系统<span lang="EN-US">DLL</span>（其中包括了<span lang="EN-US">Windows</span>的<span lang="EN-US">API</span>），在任何开发环境中都能被调用，不在乎其是<span lang="EN-US">Visual Basic</span>、<span lang="EN-US">Visual C++</span>还是<span lang="EN-US">Delphi</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　（<span lang="EN-US">2</span>）动态链接库随处可见<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　我们在<span lang="EN-US">Windows</span>目录下的<span lang="EN-US">system32</span>文件夹中会看到<span lang="EN-US">kernel32.dll</span>、<span lang="EN-US">user32.dll</span>和<span lang="EN-US">gdi32.dll</span>，<span lang="EN-US">windows</span>的大多数<span lang="EN-US">API</span>都包含在这些<span lang="EN-US">DLL</span>中。<span lang="EN-US">kernel32.dll</span>中的函数主要处理内存管理和进程调度；<span lang="EN-US">user32.dll</span>中的函数主要控制用户界面；<span lang="EN-US">gdi32.dll</span>中的函数则负责图形方面的操作。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　一般的程序员都用过类似<span lang="EN-US">MessageBox</span>的函数，其实它就包含在<span lang="EN-US">user32.dll</span>这个动态链接库中。由此可见<span lang="EN-US">DLL</span>对我们来说其实并不陌生。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　<span lang="EN-US">(3)VC</span>动态链接库的分类<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　　<span lang="EN-US">Visual C++</span>支持三种<span lang="EN-US">DLL</span>，它们分别是<span lang="EN-US">Non-MFC DLL</span>（非<span lang="EN-US">MFC</span>动态库）、<span lang="EN-US">MFC Regular DLL</span>（<span lang="EN-US">MFC</span>规则<span lang="EN-US">DLL</span>）、<span lang="EN-US">MFC Extension DLL</span>（<span lang="EN-US">MFC</span>扩展<span lang="EN-US">DLL</span>）。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">非<span lang="EN-US">MFC</span>动态库不采用<span lang="EN-US">MFC</span>类库结构，其导出函数为标准的<span lang="EN-US">C</span>接口，能被非<span lang="EN-US">MFC</span>或<span lang="EN-US">MFC</span>编写的应用程序所调用；<span lang="EN-US">MFC</span>规则<span lang="EN-US">DLL </span>包含一个继承自<span lang="EN-US">CWinApp</span>的类，但其无消息循环；<span lang="EN-US">MFC</span>扩展<span lang="EN-US">DLL</span>采用<span lang="EN-US">MFC</span>的动态链接版本创建，它只能被用<span lang="EN-US">MFC</span>类库所编写的应用程序所调用。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">一<span lang="EN-US">. Non-MFC DLL</span>的编写步骤：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;" lang="EN-US">1</span><span style="font-family: 宋体;">、新建项目<span lang="EN-US">-&gt;
win32</span>项目<span lang="EN-US">-&gt;</span>应用程序设置<span lang="EN-US">-&gt;</span>应用程序类型：
选择<span lang="EN-US">DLL</span>，完成。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;" lang="EN-US">2</span><span style="font-family: 宋体;">、添加变量、函数或类到库中，例如：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">/* </span><span style="font-family: 宋体;">文件名：<span lang="EN-US">xxx.h</span>　<span lang="EN-US">*/<br>
#ifndef XXX_H<br>
#define XXX_H<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: blue;" lang="EN-US">#ifndef</span><span style="font-family: 宋体;" lang="EN-US"> LIB_EXPORTS<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: gray;" lang="EN-US">#define
LIB_API __declspec(dllimport)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: blue;" lang="EN-US">#else<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: blue;" lang="EN-US">#define</span><span style="font-family: 宋体;" lang="EN-US"> LIB_API <span style="color: blue;">__declspec</span>(<span style="color: blue;">dllexport</span>)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: blue;" lang="EN-US">#endif<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: blue;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">extern "C" int </span><span style="font-family: 宋体; color: gray;" lang="EN-US">LIB_API</span><span style="font-family: 宋体;" lang="EN-US"> max(int x, int y);<br>
#endif<br>
<!--[if !supportLineBreakNewLine]--><br>
<!--[endif]--><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">/* </span><span style="font-family: 宋体;">文件名：<span lang="EN-US">xxx.cpp</span>　<span lang="EN-US">*/<br>
<!--[if !supportLineBreakNewLine]--><br>
<!--[endif]--><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">#include "xxx.h"<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">int add(int x, int y)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">　<span lang="EN-US">return x &gt; y ? </span>ｘ ｙ<span lang="EN-US">;<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 在动态库的工程属性<span lang="EN-US">-&gt;C/C++-&gt;</span>预处理器<span lang="EN-US">-&gt;</span>预处理器定义里，添</span><span style="font-family: 宋体;" lang="EN-US">LIB_EXPORTS</span><span style="font-family: 宋体;">。 编译。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; 3. </span><span style="font-family: 宋体;">创建另外一个工程，来调用该库 <span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 调用<span lang="EN-US">DLL</span>有两种方式：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 20.25pt; text-indent: -20.25pt;"><!--[if !supportLists]--><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; (1)<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp; </span></span></span><!--[endif]--><span style="font-family: 宋体;">显式调用<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: blue;" lang="EN-US">typedef</span><span style="font-family: 宋体;" lang="EN-US"> <span style="color: blue;">int</span> (*pDllFunc)(<span style="color: blue;">int</span> , <span style="color: blue;">int</span>);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">HINSTANCE hDll =
LoadLibrary(_T(<span style="color: #a31515;">"xxx.dll"</span>));<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">pDllFunc pMax = NULL;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: blue;" lang="EN-US">if</span><span style="font-family: 宋体;" lang="EN-US"> (hDll) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pMax = (pDllFunc)GetProcAddress(hDll, <span style="color: #a31515;">"max"</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (pMax) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>std::cout &lt;&lt;
pMax(21, 22) &lt;&lt; std::endl;<span> </span><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">if (hDll) {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;" lang="EN-US">FreeLibrary(hDll);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; (2) </span><span style="font-family: 宋体;">隐式调用<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 首先，包含该库的头文件<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 其次，链接动态库，把保存库的目录添加到工程属性<span lang="EN-US">-&gt;</span>连接器<span lang="EN-US">-&gt;</span>常规<span lang="EN-US">-&gt;</span>附加库目录，在工程属性<span lang="EN-US">-&gt;</span>连接器<span lang="EN-US">-&gt;</span>输入<span lang="EN-US">-&gt;</span>附加依赖项添加库的<span lang="EN-US">lib</span>文件名 或者在程序中用<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; color: blue;" lang="EN-US">#pragma</span><span style="font-family: 宋体;" lang="EN-US"> <span style="color: blue;">comment</span>(<span style="color: blue;">lib</span>, <span style="color: #a31515;">".\\lib\\xxx.lib"</span>)</span><span style="font-family: 宋体;">添加<span lang="EN-US">(</span>若已经添加库的目录，就不需要相当路径，直接写<span lang="EN-US">lib</span>文件名&#8220;<span style="color: #a31515;" lang="EN-US">xxx.lib</span><span style="color: #a31515;">&#8221;</span><span lang="EN-US">)<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 然后就可以直接用变量，函数或者类了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">注意：隐式调用和显示调用的区别：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">隐式调用的方法比较方便，但<span lang="EN-US">DLL</span>改变后，应用程序须从新编译。并且，所有所调用的<span lang="EN-US">DLL</span>在应用程序加载的同时被加载到内存中，当应用程序调用的<span lang="EN-US">DLL</span>比较多时，装入的过程十分慢。显式调用则比较灵活，但比较麻烦<span lang="EN-US">.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 二 </span><span style="font-family: 宋体;" lang="EN-US">MFC Regular DLL </span><span style="font-family: 宋体;">的编写步骤：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; 1</span><span style="font-family: 宋体;">、新建项目<span lang="EN-US">-&gt;MFC DLL-&gt;</span>应用程序设置<span lang="EN-US">-&gt;</span>选择<span lang="EN-US">DLL</span>类型，完成。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 5.25pt; text-indent: -5.25pt;"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">注意：静态链接<span lang="EN-US">MFC DLL</span>和共享<span lang="EN-US">MFC DLL</span>的区别：静态链接把程序中要用的在<span lang="EN-US">MFC DLL</span>里的东西全部编译到创建的<span lang="EN-US">DLL</span>中，体积会大一点，但可以在没有装<span lang="EN-US">MFC</span>的机器上运行<span lang="EN-US"></span>；通过共享创建的<span lang="EN-US">DLL</span>体积小，但在没有安装<span lang="EN-US">MFC</span>的机器上有可能不能运行，因为没有相应的库。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 5.25pt; text-indent: -5.25pt;"><span style="font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; 2</span><span style="font-family: 宋体;">、其他步骤和创建<span lang="EN-US">Non-MFC
DLL</span>差不多。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 5.25pt; text-indent: -5.25pt;"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 三<span lang="EN-US">
MFC</span>扩展<span lang="EN-US">DLL<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 5.25pt; text-indent: -5.25pt;"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 这里有比较详细的介绍<span lang="EN-US"><a href="http://tech.163.com/06/0316/10/2CB2S3HP0009159F.html">http://tech.163.com/06/0316/10/2CB2S3HP0009159F.html</a></span>。<span lang="EN-US"><o:p></o:p></span></span></p><img src ="http://www.cppblog.com/FandyM/aggbug/125130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2010-08-29 10:12 <a href="http://www.cppblog.com/FandyM/archive/2010/08/29/125130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC改变控件颜色</title><link>http://www.cppblog.com/FandyM/archive/2010/07/21/120972.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Wed, 21 Jul 2010 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2010/07/21/120972.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/120972.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2010/07/21/120972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/120972.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/120972.html</trackback:ping><description><![CDATA[MFC应用程序中，要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可
重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。<br><br>常用的此类消息有： &nbsp; <br>
CTLCOLOR_DLG &nbsp; 对话框 &nbsp;  <br> CTLCOLOR_EDIT &nbsp; 编辑框 <br>
CTLCOLOR_LISTBOX &nbsp; 列表框 &nbsp;  <br> CTLCOLOR_MSGBOX &nbsp; 消息框 <br>
CTLCOLOR_SCROLLBAR &nbsp; 滑动条 <br> CTLCOLOR_STATIC &nbsp; 静态文本框、矩形等。 <br>  <br> 主要有三步：<br>1. 声明消息响应函数<br>
//{{AFX_MSG(CMyDialog) <br> afx_msg &nbsp; HBRUSH &nbsp; OnCtlColor(CDC* &nbsp;
pDC, &nbsp; CWnd* &nbsp; pWnd, &nbsp; UINT &nbsp; nCtlColor); <br> &#8230;&#8230;<br>
//}}AFX_MSG <br>  <br> DECLARE_MESSAGE_MAP() &nbsp;  <br>  <br>  2. 实现消息响应函数<br>以编辑框举例：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">HBRUSH&nbsp;&nbsp;&nbsp;CMyDialog::OnCtlColor(CDC</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;pDC,&nbsp;&nbsp;&nbsp;CWnd</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;pWnd,&nbsp;&nbsp;&nbsp;UINT&nbsp;&nbsp;&nbsp;nCtlColor)&nbsp; <br>{<br>&nbsp;&nbsp;&nbsp; HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);<br>&nbsp;&nbsp;&nbsp; CtlColor(pDC,&nbsp;pWnd,&nbsp;nCtlColor);<br></span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; if</span><span style="color: #000000;">(nCtlColor</span><span style="color: #000000;"> ==</span><span style="color: #000000;"> CTLCOLOR_EDIT&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;"> pWnd</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">GetDlgCtrlID() </span><span style="color: #000000;">==</span><span style="color: #000000;"> IDC_EDIT1)</span><span style="color: #008000;"></span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetTextColor(RGB(0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,255</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetBkColor(RGB(</span><span style="color: #000000;">255</span><span style="color: #000000;">,0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">));</span><span style="color: #008000;">//</span><span style="color: #008000;">设置文本背景色</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">SetBkMode(TRANSPARENT);</span><span style="color: #008000;">//</span><span style="color: #008000;">设置背景透明</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hbr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span>::CreateSolidBrush(<span style="color: #000000;">RGB(</span><span style="color: #000000;">255</span><span style="color: #000000;">,0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">))</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp; }<br></span><span style="color: #0000ff;">&nbsp;&nbsp;&nbsp; return</span><span style="color: #000000;">&nbsp;hbr;<br>}</span></div>
<br>3. 添加消息映射<br>BEGIN_MESSAGE_MAP(<span style="color: #000000;">CMyDialog</span>, CDialog)<br>&nbsp;&nbsp;&nbsp; ON_WM_CTLCOLOR() <br>END_MESSAGE_MAP()<br>  <br>  注意：此方法不适用于按纽控件。 <br><img src ="http://www.cppblog.com/FandyM/aggbug/120972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2010-07-21 16:49 <a href="http://www.cppblog.com/FandyM/archive/2010/07/21/120972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6 和 vs2005 combobox 下拉列表高度的区别</title><link>http://www.cppblog.com/FandyM/archive/2010/07/19/120755.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Mon, 19 Jul 2010 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2010/07/19/120755.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/120755.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2010/07/19/120755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/120755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/120755.html</trackback:ping><description><![CDATA[vc6下拉列表的高度有三种方法更改：<br>1. 在.RC界面先点击下拉按钮，然后拖动虚框，虚框即是下拉列表的大小；<br>2. 在.rc文件里直接修改combobox的高度；<br>3. 创建完combobox后，调用movewindow修改。<br><br>vs2005和vc6略有不同：<br>vc6的三种方法都可以使用，只不过设置的高度小于显示30个item的高度时，会默认高度为30个item的高度。<br><br><img src ="http://www.cppblog.com/FandyM/aggbug/120755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2010-07-19 10:54 <a href="http://www.cppblog.com/FandyM/archive/2010/07/19/120755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6编译问题</title><link>http://www.cppblog.com/FandyM/archive/2010/07/14/120354.html</link><dc:creator>长风</dc:creator><author>长风</author><pubDate>Wed, 14 Jul 2010 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/FandyM/archive/2010/07/14/120354.html</guid><wfw:comment>http://www.cppblog.com/FandyM/comments/120354.html</wfw:comment><comments>http://www.cppblog.com/FandyM/archive/2010/07/14/120354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FandyM/comments/commentRss/120354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FandyM/services/trackbacks/120354.html</trackback:ping><description><![CDATA[公司的产品有两个版本，一个用vs2005编译，一个用vc6编译。<br>新增了个功能，用vs2005编译后没问题，用vc6编译的就不好使。我的机器上没有装vc6，所以装vc6调试。<br>装完后编译出现以下问题：<br>
<pre>NOTE: WINVER has been defined as 0x0500 or greater which enables<br>Windows NT 5.0 and Windows 98 features. When these headers were released,<br>Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.<br>For this release when WINVER is defined as 0x0500 or greater, you can only<br>build beta or test applications.  To build a retail application,<br>set WINVER to 0x0400 or visit <a  href="http://www.microsoft.com/msdn/sdk" target="_blank">http://www.microsoft.com/msdn/sdk</a><br>to see if retail Windows NT 5.0 or Windows 98 headers are available.<br>See the SDK release notes for more information.<br></pre>
一番google，原来是SDK没有更新。<br>然后更新SDK，给vc6打补丁。<br><br>然后继续编译，出现头文件找不到。添加环境变量，解决之。<br><br>新添加的环境变量只对新建的进程有效，所以必须重启vc6才好使。<br><br><img src ="http://www.cppblog.com/FandyM/aggbug/120354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FandyM/" target="_blank">长风</a> 2010-07-14 17:18 <a href="http://www.cppblog.com/FandyM/archive/2010/07/14/120354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>