ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产色AV免费观看,久久亚洲2019中文字幕,精品久久久久久无码不卡http://www.shnenglu.com/killsound/category/3471.htmlC/C++ 交æµzh-cnThu, 03 Dec 2009 07:03:56 GMTThu, 03 Dec 2009 07:03:56 GMT60VC 6.0中编译和使用OpenSSL的过½E?/title><link>http://www.shnenglu.com/killsound/articles/102374.html</link><dc:creator>ž®ä¸æ‡‚^_^</dc:creator><author>ž®ä¸æ‡‚^_^</author><pubDate>Wed, 02 Dec 2009 02:51:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/articles/102374.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/102374.html</wfw:comment><comments>http://www.shnenglu.com/killsound/articles/102374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/102374.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/102374.html</trackback:ping><description><![CDATA[<p class="g_p_center g_t_wrap g_t_left g_t_20 g_c_pdin c07" id=blogtitle_fks_085074092094082068093094084095081083084075087086085068 style="MARGIN: 20px auto 10px"><span style="FONT-FAMILY: 'å¾®èÊY雅黑','黑体',Arial,Helvetica,Sans-Serif">VC 6.0中编译和使用OpenSSL的过½E?/span></p> <div id="j3nb993" class=g_blog_list> <div id="fhj9fb9" class="g_t_center g_c_pdin g_p_center c07 content" id=blogtext_fks_085074092094082068093094084095081083084075087086085068> <div id="f9b9x9n" class=ns_content> <p>一ã€ç¼–è¯‘åÆˆå®‰è£…OpenSSL</p> <p>1ã€æŒ‰ç…§æ ‡å‡†æ­¥éª¤ä»Žæºä»£ç ç¼–译安装OpenSSL<br>    在编译OpenSSLå‰ï¼Œéœ€è¦æ­£¼‹®å®‰è£…PerlåQŒå› ä¸ºåœ¨¾~–译OpenSSLæ—‰™œ€è¦ä‹É用到该程åºã€?br>   <br>    ä¸‹è²æœ€æ–°ç‰ˆæœ¬çš„PerlåQ?a ><font color=#6aa50d>http://downloads.activestate.com/ActivePerl/Windows/</font></a>。然åŽå®‰è£…之ã€?/p> <p>    ä¸‹è²æœ€æ–°ç‰ˆæœ¬çš„OpenSSLåQ?a ><font color=#6aa50d>http://www.openssl.org/source/</font></a><br>   <br>    然厞®†æºç è§£åŽ‹ç¾ƒåˆ°æŸä¸ªç›®å½•(å¦?C:\openssl-0.9.8jåQ‰ä¸­ã€?br>   <br>    ˜q›å…¥opensslæºç ç›®å½•ã€?br>    cd c:\openssl-0.9.8.j<br>   <br>    以下为å‚照该目录下的文äšgINSTALL.W32的执行过½E‹ï¼š</p> <p>    ˜q行configureåQ?br>    perl Configure VC-WIN32 --prefix=c:/openssl</p> <p>    创å¾Makefileæ–‡äšgåQ?br>    ms\do_ms<br>   <br>    ¾~–译动æ€åº“åQ?br>    nmake -f ms\ntdll.mak<br>    ¾~–è¯‘é™æ€åº“åQ?br>    nmake -f ms\nt.mak</p> <p>    ‹¹‹è¯•动æ€åº“åQ?br>    nmake -f ms\ntdll.mak test<br>    ‹¹‹è¯•陿€åº“åQ?br>    nmake -f ms\nt.mak test</p> <p>    安装动æ€åº“åQ?br>    nmake -f ms\ntdll.mak install<br>    å®‰è£…é™æ€åº“åQ?br>    nmake -f ms\nt.mak install</p> <p>    清除上次动æ€åº“çš„ç¼–è¯‘ï¼Œä»¥ä¾¿é‡æ–°¾~–译åQ?br>    nmake -f ms\ntdll.mak clean<br>    æ¸…é™¤ä¸Šæ¬¡é™æ€åº“çš„ç¼–è¯‘ï¼Œä»¥ä¾¿é‡æ–°¾~–译åQ?br>    nmake -f ms\nt.mak clean</p> <p>2ã€å¦‚果嫌éºÈƒ¦åQŒä¸æƒ³ç¼–译,å¯ä»¥ç›´æŽ¥ç”¨åˆ«äººåšå¥½çš„windows OpenSSL 安装包(我用的是0.9.8j版)åQ?br>   å¯ä»¥ä»?<a ><font color=#6aa50d>http://www.slproweb.com/products/Win32OpenSSL.html</font></a> ä¸‹è² OpenSSL for WindowsåQŒç›´æŽ¥å®‰è£…ã€?/p> <p>P.S. OpenSSL for Windows çš„æºä»£ç æœ‰ä¸€äº›æ•°æ®ç±»åž‹å’ŒVC6的编译器ä¸å…¼å®¹ï¼Œæˆ‘å‘现的ä¸å…¼å®¹çš„æ•°æ®¾cÕdž‹å¦‚下åQ?br>  在OpenSSL安装目录的下的include/bn.hæ–‡äšg中,ž®?br>    #define BN_ULLONG unsigned long long<br>    #define BN_ULONG unsigned long long<br>    #define BN_LONG long long<br>    分别修改为:<br>    #define BN_ULLONG ULONGLONG<br>    #define BN_ULONG ULONGLONG<br>    #define BN_LONG LONGLONG</p> <p>    å¦åˆ™åQŒä¼šå‡ºçް¾~–译错误ã€?/p> <p><br>二ã€ä‹É用OpenSSL</p> <p>    在VC中酾|®ä‹É用以上的函数库:<br>    点击èœå•åQšTools -> OptionsåQŒå¼¹å‡ºå¯¹è¯æ¡†"Options"åQŒåœ¨è¯¥å¯¹è¯æ¡†ä¸­é€‰æ‹©"Directories"标签ã€?br>    åœ?Show directories for:"çš?Include files"选项中新增目å½?C:\openssl\include"åQ?br>      "Library files"选择中新增目å½?C:\openssl\lib"ã€?/p> <p>    ç„¶åŽåœ¨éœ€è¦é“¾æŽ¥OpenSSL函数库的工程中加入如下两å¥ï¼š<br>    #pragma comment(lib, "ssleay32.lib")<br>    #pragma comment(lib, "libeay32.lib")<br>    其作用是ž®†OpenSSL所需的库导入工程中ã€?/p> <p>三ã€é—®é¢?/p> <p>    我在链接OpenSSLçš„é™æ€å‡½æ•°åº“æ—‰™‡åˆ°ç±»ä¼ég»¥ä¸‹çš„问题åQ?br>    Linking...<br>    msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj)<br>    ...<br>   <br>    ˜q™æ˜¯ç”׃ºŽOpenSSLçš„é™æ€å‡½æ•°åº“使用的是了VC的多¾U¿ç¨‹DLLçš„Release版本åQŒè€Œæˆ‘的程åºä‹É用了多线½E‹é™æ€é“¾æŽ¥çš„Release版本ã€?/p> <p>    调整OpenSSLçš„é™æ€å‡½æ•°åº“使用的库函数版本å›_¯åQŒè°ƒæ•´è¿‡½E‹å¦‚下:<br>   <br>    ¾~–辑文äšg ms\nt.makåQŒå°†è¯¥æ–‡ä»¶ç¬¬19è¡?br>    "CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -</p> <p>D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -</p> <p>DOPENSSL_NO_DYNAMIC_ENGINE"<br>    中的"/MD"修改ä¸?/MT"。然åŽé‡æ–°ç¼–译安装OpenSSLå›_¯ã€?/p> <p>å››ã€é™„录:在VC中对C/C++ ˜q行时库ä¸åŒç‰ˆæœ¬¾~–译指ä×o说明<br>    《在VC中对C/C++ ˜q行时库ä¸åŒç‰ˆæœ¬¾~–译指ä×o说明ã€?<a ><font color=#6aa50d>http://blog.yesky.com/271/dgkang/1737771.shtml</font></a>)一文中详细介ç»äº†è¿žæŽ¥ä¸åŒç‰ˆæœ¬åº“的编译指令如下:<br>    C Runtime LibraryåQ?br>        /MD        MSVCRT.LIB     多线½E‹DLLçš„Release版本<br>        /MDd       MSVCRTD.LIB    多线½E‹DLLçš„Debug版本<br>        /MT        LIBCMT.LIB     多线½E‹é™æ€é“¾æŽ¥çš„Release版本<br>        /MTd       LIBCMTD.LIB    多线½E‹é™æ€é“¾æŽ¥çš„Debug版本<br>        /clr       MSVCMRT.LIB    托管代ç å’Œéžæ‰˜ç®¡ä»£ç æ··åˆ<br>        /clr:pure  MSVCURT.LIB    ¾U¯æ‰˜½Ž¡ä»£ç ?br>    C++ Standard LibraryåQ?br>        /MD       MSVCPRT.LIB     多线½E‹DLLçš„Release版本<br>        /MDd      MSVCPRTD.LIB    多线½E‹DLLçš„Debug版本<br>        /MT       LIBCPMT.LIB     多线½E‹é™æ€é“¾æŽ¥çš„Release版本<br>        /MTd      LIBCPMTD.LIB    多线½E‹é™æ€é“¾æŽ¥çš„Debug版本</p> </div> </div> </div> <img src ="http://www.shnenglu.com/killsound/aggbug/102374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">ž®ä¸æ‡‚^_^</a> 2009-12-02 10:51 <a href="http://www.shnenglu.com/killsound/articles/102374.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>(è½?ž®?Win32 C/C++ 应用½E‹åº˜qç§»åˆ?POWER 上的 LinuxåQŒç¬¬ 3 部分: ä¿¡å· http://www.shnenglu.com/killsound/articles/81951.htmlž®ä¸æ‡‚^_^ž®ä¸æ‡‚^_^Tue, 05 May 2009 08:17:00 GMThttp://www.shnenglu.com/killsound/articles/81951.htmlhttp://www.shnenglu.com/killsound/comments/81951.htmlhttp://www.shnenglu.com/killsound/articles/81951.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/81951.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/81951.html阅读全文

ž®ä¸æ‡‚^_^ 2009-05-05 16:17 å‘表评论
]]>
(è½?ž®?Win32 C/C++ 应用½E‹åº˜qç§»åˆ?POWER 上的 LinuxåQŒç¬¬ 2 部分: 互斥http://www.shnenglu.com/killsound/articles/81950.htmlž®ä¸æ‡‚^_^ž®ä¸æ‡‚^_^Tue, 05 May 2009 08:14:00 GMThttp://www.shnenglu.com/killsound/articles/81950.htmlhttp://www.shnenglu.com/killsound/comments/81950.htmlhttp://www.shnenglu.com/killsound/articles/81950.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/81950.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/81950.html阅读全文

ž®ä¸æ‡‚^_^ 2009-05-05 16:14 å‘表评论
]]>
(è½?Win32 C/C++ 应用½E‹åº˜qç§»åˆ?POWER 上的 Linux ½W?1 部分: ˜q›ç¨‹ã€çº¿½E‹å’Œå…׃ín内存æœåŠ¡http://www.shnenglu.com/killsound/articles/81949.htmlž®ä¸æ‡‚^_^ž®ä¸æ‡‚^_^Tue, 05 May 2009 08:12:00 GMThttp://www.shnenglu.com/killsound/articles/81949.htmlhttp://www.shnenglu.com/killsound/comments/81949.htmlhttp://www.shnenglu.com/killsound/articles/81949.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/81949.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/81949.html阅读全文

ž®ä¸æ‡‚^_^ 2009-05-05 16:12 å‘表评论
]]>
明明白白Infæ–‡äšghttp://www.shnenglu.com/killsound/articles/27064.htmlž®ä¸æ‡‚^_^ž®ä¸æ‡‚^_^Wed, 27 Jun 2007 07:35:00 GMThttp://www.shnenglu.com/killsound/articles/27064.htmlhttp://www.shnenglu.com/killsound/comments/27064.htmlhttp://www.shnenglu.com/killsound/articles/27064.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/27064.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/27064.html转è²]明明白白Infæ–‡äšg

ä¿¡æ¯æ¥æºåQšç½‘¾l?br>
INFæ–‡äšg全称Information Fileæ–‡äšgåQŒæ˜¯Winodwsæ“作¾pÈ»Ÿä¸‹ç”¨æ¥æ˜q°è®¾å¤‡æˆ–æ–‡äšg½{‰æ•°æ®ä¿¡æ¯çš„æ–‡äšg。INFæ–‡äšg是由标准的ASCIIç ç»„æˆï¼Œæ‚¨å¯ä»¥ç”¨ä»ÖM½•一‹Æ¾æ–‡å­—编辑器查看修改其中的内å®V€‚一般我们æ€ÀL˜¯è®¤äØ“INFæ–‡äšg是系¾lŸè®¾å¤‡çš„驱动½E‹åºåQŒå…¶å®žè¿™æ˜¯é”™è¯¯çš„认识åQŒWindows之所以在安装æŸäº›¼‹¬äšg的驱动时æç¤ºéœ€è¦INFæ–‡äšg是因为INFæ–‡äšg䏸™¯¥è®‘Ö¤‡æä¾›äº†ä¸€ä¸ªå…¨é¢æ˜q°ç¡¬ä»¶å‚数和相应驱动文äšg(DLLæ–‡äšg)的信æ¯ã€‚就好比我们看ç€è¯´æ˜Žä¹¦å®‰è£…ç”µè„‘ç¡¬ä»¶ä¸€æ øP¼Œæˆ‘们ž®±æ˜¯Windows¾pÈ»ŸåQŒè¯´æ˜Žä¹¦ž®±æ˜¯INFæ–‡äšg。INFæ–‡äšg功能éžå¸¸å¼ºå¤§åQŒå‡ ä¹Žèƒ½å®Œæˆæ—¥å¸¸æ“作的所有功能。您å¯ä»¥æŠŠå®ƒçœ‹æˆæ˜¯Windows¾pÈ»Ÿåº•下的超强批åˆç†ã€‚è¦ç†Ÿç»ƒæŽŒæ¡å’Œç†è§£ç”šè‡Ïx˜¯¾~–写INFæ–‡äšg需è¦å¯¹å…¶å†…部结构有相当的认识。下é¢å°±è®©æˆ‘ä»¬æ¥æ·±å…¥åˆ°INFæ–‡äšg中的内部一½H¥å…¶çœŸé¢è²Œå§åQ?br>
INFæ–‡äšgçš„ç»„æˆæœ‰èŠ?Sections)åQŒé”®(Key)å’Œå€?value)三部分ã€?br>关键节有
[Version]版本æè¿°ä¿¡æ¯åQŒä¸»è¦ç”¨äºŽç‰ˆæœ¬æŽ§åˆ¶ã€?br>[Strings]字符串信æ¯ï¼Œç”¨äºŽå¸”R‡å®šä¹‰ã€?br>[DestinationDirs]定义¾pÈ»Ÿè·¯å¾„ä¿¡æ¯ã€?br>[SourceDisksNames]指明æºç›˜ä¿¡æ¯ã€?br>[SourceDisksNames]指明æºç›˜æ–‡äšgåã€?br>[DefaultInstall]开始执行安装ã€?br>其它的节å¯ä»¥è‡ªå®šä¹‰ï¼Œä¸‹é¢ç”¨ä¸€å®žä¾‹æ¥å…·ä½“讲解ã€?br>

½E‹åºä»£ç 
[Version]
Signature=$Chicago$
Provider=%Author%

[Strings]
Product="æ·ÕdŠ æ–‡äšgå…Œ™”演示"
Version="1.0"
Author="Xunchi"
Copyright="Copyright 2005"
CustomFile="inf" ;修改您需è¦çš„æ–‡äšgå厾~€
Program="NOTEPAD.EXE" ;修改您需è¦å…³è”的应用½E‹åºå?br>
[Add.Reg]
HKCR,"."%CustomFile%,"",FLG_ADDREG_TYPE_SZ ,%CustomFile%File
HKCR,%CustomFile%File,"",FLG_ADDREG_TYPE_SZ,安装信æ¯
HKCR,%CustomFile%"File\shell","",FLG_ADDREG_TYPE_SZ,open
HKCR,%CustomFile%"File\shell\open\command","",FLG_ADDREG_TYPE_SZ,%program% %1

[DefaultInstall]
AddReg=Add.Reg

  在[Version]节中"Signature"™å¹å®šä¹‰äº†è¯¥INFæ–‡äšg需è¦è¿è¡Œåœ¨ä½•ç§æ“作¾pÈ»Ÿç‰ˆæœ¬ä¸­ã€‚有$Windows NT$, $Chicago$, or $Windows 95$三个å€ég¾›é€‰æ‹©åQŒä¸€èˆ¬é€‰æ‹©$Chicago$å›_¯ã€‚项Providerä¸­å®šä¹‰äº†è¯¥æ–‡ä»¶çš„åˆ›ä½œæ¥æºåQ?Author%指引用Author™å¹çš„倹{€‚您也å¯è‡ªå®šå…¶å®ƒ™åÒŽ¥æè¿°è¯¥INFæ–‡äšg的版本信æ¯ã€‚该INFæ–‡äšg的作用是兌™”æ–‡äšgåQŒæ‰€ä»¥ä¸»è¦æ˜¯å¯Ò޳¨å†Œè¡¨çš„æ“ä½œï¼Œæˆ‘ä»¬æ¥çœ‹[Add.Reg]节,共四æ¡è¯­å¥ï¼Œæ ¼å¼éƒ½æ˜¯ä¸€æ —÷€‚HKCR表示根HKEY_CLASSES_ROOTåQŒç¬¬äºŒä¸ªå‚数是å­é”®çš„路径å,½W¬ä¸‰ä¸ªå‚数是表明值的¾cÕdž‹åQŒæœ€åŽæ˜¯å€?具体è§é™„è¡?。以上都是对æ“作的定义与˜q‡ç¨‹åQŒåœ¨èŠ‚[DefaultInstall]中是开始执行è¦å®‰è£…的浽E‹ï¼ŒAddReg表明是对注册表进行æ“作,æ“作对象是Add.Reg节中的定义。如果您把AddRegæ¢æˆDelReg则是删除注册表中的键倹{€‚当鼠标å•击该INFæ–‡äšg在弹出的èœå•中选择“安装”ž®±å¼€å§‹æ‰§è¡Œæ‚¨æ‰€å®šä¹‰çš„æ“ä½œã€‚è¯¥½CÞZ¾‹åœ¨ç³»¾lŸçš„INFæ–‡äšgå³é”®èœå•中增加了查看¾~–辑功能òq¶è®¾¾|®äº†é»˜è®¤åŠ¨ä½œåQŒå› ä¸ºåœ¨å®‰è£…了ä¸äº†è§£çš„INFæ–‡äšg有å¯èƒ½å¯¹¾pÈ»Ÿäº§ç”Ÿä¸è‰¯çš„媄å“,˜q™æ ·åŒå‡»æ–‡äšgž®±å¯æ‰“å¼€¾~–辑该文件了ã€?br>

  å†çœ‹çœ‹INFæ–‡äšg在文件æ“作方é¢çš„能力å§ã€‚请看下é¢çš„一个例å­ã€?br>
½E‹åºä»£ç 
[Version]
Signature=$Chicago$
Provider=%Author%
[Strings]
Product="æ–‡äšgå¤åˆ¶å’Œå®‰è£…æ¼”½C?
Version="1.0"
Author="Xunchi"
Copyright="Copyright 2005"

[FileList]
ProcessList.exe ;此文件已在当å‰ç›®å½•下åQŒä¸‹åŒã€?br>
[FileList1]
Wordpad.exe
[DestinationDirs]
FileList=11 ;安装到Windows的系¾lŸç›®å½?br>FileList1=10 ;安装到Windows目录
[DefaultInstall]
Copyfiles=FileList,FileList1

  相åŒçš„节的作用与上一例类ä¼û|¼Œè¯äh³¨æ„新出现的节[FileList]åQŒè¿™æ˜¯æˆ‘自定义的节ååQŒå®ƒè¡¨ç¤ºäº†ä¸€ä¸ªæ–‡ä»¶ç»„åQŒ[FileList1]也类伹{€‚在节[DestinationDirs]中需定义æ¯ä¸ªæ–‡äšg¾l„å¤åˆ¶åˆ°çš„ç›®å½?å„个帔R‡çš„æ„ä¹‰è§é™„表)。Copyfiles指明了需è¦è¿›è¡Œå¤åˆ¶çš„æ–‡äšg¾l„ã€?br>  INFæ–‡äšgçš„æ“作还包括æœåŠ¡(NT¾pÈ»Ÿ)½E‹åºçš„安装和å¸è²åQŒINIæ–‡äšgçš„è{æ¢ç­‰ã€‚由于这些æ“ä½œéƒ½æ¯”è¾ƒçš„å¤æ‚å’Œ¾JçåQŒä¸”有一定的å±é™©æ€§æ•…下次有机会å†å‘大家进行深入探讨ã€?br>ã€€ã€€æœ€åŽæˆ‘们æ¥çœ‹ä¸€ä¸‹INFæ–‡äšg的执行机åˆÓž¼Œ˜q™æ—¶ä½ ä¹Ÿè®¸è¦é—®ä¸ž®±æ˜¯½Ž€å•的执行一ä¸?#8220;安装”å—?知其然ä¸çŸ¥å…¶æ‰€ä»¥ç„¶çŸ¥è¯†æ°´åã^是ä¸ä¼šæé«˜çš„。在“æ–‡äšg多w€‰é¡¹”中的“æ–‡äšg¾cÕdž‹”扑ֈ°INFæ–‡äšgçš?#8220;安装”命ä×o看到一串命令ã€?#8220;rundll32.exe setupapi,InstallHinfSection DefaultInst_all 132 %1”它表½CÞZº†˜q行Dllæ–‡äšgsetupapi.dll中的命ä×oInstallHinfSectionòq¶ä¼ é€’给它è“v始节的åå­?nbsp;DefaultInstall。å¯è§è“v始节是å¯ä»¥è‡ªå®šä¹‰çš„。INFæ–‡äšg的执行也å¯ç”¨åœ¨å„¿U支æŒAPI调用的编½E‹å·¥å…·ä¸­ã€‚至此INFæ–‡äšg的结构和˜q行机制我们已基本了解,现在ž®Þp®©ä½ çš„æ€ç»´å¼€åŠ¨è“væ¥ï¼Œè®©å®ƒæ›´å¥½çš„äØ“æˆ‘ä»¬å·¥ä½œå§ã€?br>

注册表æ“作的帔R‡å®šä¹‰åQ?br>----------------------------------------------------------
帔R‡ æ ¹å€?nbsp;
HKCR HKEY_CLASSES_ROOT.
HKCU HKEY_CURRENT_USER.
HKLM HKEY_LOCAL_MACHINE.
HKU HKEY_USERS.
----------------------------------------------------------- 
FLG_ADDREG_APPEND åœ¨å¤šå­—ç¬¦ä¸²åŽæ·ÕdŠ å­—ç¬¦
FLG_ADDREG_TYPE_SZ å­—符¾cÕdž‹
FLG_ADDREG_TYPE_MULTI_SZ å­—符串类åž?br>FLG_ADDREG_TYPE_EXPAND_SZ æ‰©å±•字符串类åž?br>FLG_ADDREG_TYPE_BINARY äºŒè¿›åˆ¶å€?br>FLG_ADDREG_TYPE_DWORD DWordå€?br>FLG_ADDREG_TYPE_NONE NULLå€?br>----------------------------------------------------------


[DestinationDirs]节中所定义的常é‡èµ\å¾?br>----------------------------------------------------------
01 æºç›®å½?åŽè·Ÿè·¯å¾„)
10 Windows目录
11 Windows¾pÈ»Ÿç›®å½•
12 é©±åŠ¨ç›®å½•
17 INFæ–‡äšg目录
18 å¸®åŠ©æ–‡äšg目录
20 å­—体目录
21 æ ¹ç›®å½?br>24 åº”用½E‹åºç›®å½•
25 å…׃ín目录
30 å½“剿 ¹ç›®å½?br>50 System目录
51 Spool ç›®å½•
52 Spool é©±åŠ¨ç›®å½•
53 ç”¨æˆ·é…置目录
----------------------------------------------------------

[DefaultInstall]节中定义的æ“ä½?br>----------------------------------------------------------
LogConfig Log日志文äšgé…ç½®
Copyfiles å¤åˆ¶æ–‡äšg
Renfiles æ–‡äšg改å
Delfiles åˆ é™¤æ–‡äšg
UpdateInis æ›´æ–°Inis
UpdateIniFields æ›´æ–°Ini字段
AddReg æ·ÕdŠ æ³¨å†Œ™å?br>DelReg åˆ é™¤æ³¨å†Œ™å?br>Ini2Reg Iniæ–‡äšg转æ¢ä¸ºRegæ–‡äšg
-----------------------------------------------------------


ž®ä¸æ‡‚^_^ 2007-06-27 15:35 å‘表评论
]]>
MDI应用½E‹åºå‰–æž(è½?http://www.shnenglu.com/killsound/articles/20375.htmlž®ä¸æ‡‚^_^ž®ä¸æ‡‚^_^Thu, 22 Mar 2007 11:34:00 GMThttp://www.shnenglu.com/killsound/articles/20375.htmlhttp://www.shnenglu.com/killsound/comments/20375.htmlhttp://www.shnenglu.com/killsound/articles/20375.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/20375.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/20375.html¾cÕd 作用
CMDITestApp ‹z„¡”ŸäºŽCWinApp的应用程åºç±»ã€?
CMainFrame ‹z„¡”ŸäºŽCMDIFrameWndçš„MDI框架½H—壾c…R€?
CMDITestDoc ‹z„¡”ŸäºŽCDocument的文档类ã€?
CChildFrame ‹z„¡”ŸäºŽCMDIChildWndçš„MDIå­çª—å£ç±»ã€?
CMDITestView ‹z„¡”ŸäºŽCView的文档显½Cºç±»ã€?
在è¿è¡Œæ—¶åˆ»ï¼ŒCMainFrame, CChildFrame, CMDITestView的窗å£å…³¾pÕd¦‚下é¢çš„表格示出:
CMainFrame
åQˆMenu, Toolbar …)
MDIClient
 
CChildFrame
CMDITestView
   pDocument = *CMDITestDoc   (带有文档的指é’?
 
 
 
 
 
[StatusBar]
其中åQŒæœ€å¤–层的是™å¶å±‚½H—å£CMainFrameåQŒé‡Œé¢åŒ…å«ä¸€ä¸ªMDIClient½H— å£ã€‚CChildFrameåšäØ“å­çª—å£åŒ…å«äºŽMDIClient中(å¯ä»¥åŒ…å«å¤šÂ ä¸ªåQ‰ï¼ŒCChildFrame里é¢åˆ™æ˜¯çœŸå®žçš„æ–‡æ¡£è¡¨½Cºçª—å£CMDITestView了ã€?
 
我们从这里开始:
// CMDITestApp åˆå§‹åŒ?
BOOL CMDITestApp::InitInstance()
 
åšäØ“CWinApp的派生类åQŒé€šå¸¸éœ€è¦é‡è½½InitInstance(), ExitInstance()两个函数åQŒä»¥å®Œæˆåº” 用的åˆå§‹åŒ–和退出。我们现在关心InitInstance中关于文档模æÑ€çª—å£å¤„ç†çš„部分åQŒè€Œå¿½ç•¥æŽ‰ä¸€äº›CommonControl, OLEåˆå§‹åŒ–部分ã€?
 
整个InitInstance代ç å¦‚下åQ?
BOOL CMDITestApp::InitInstance()
{
     InitCommonControls();       // ˜q™é‡Œåˆ å‡äº†å¤§é‡æ³¨é‡Šå’Œé”™è¯¯å¤„ç†
     CWinApp::InitInstance();
     AfxOleInit();
     AfxEnableControlContainer();
     SetRegistryKey(_T("应用½E‹åºå‘导生æˆçš„æœ¬åœ°åº”用程åº?);
     LoadStdProfileSettings(4);  //Â åŠ è²æ ‡å‡†Â INI 文äšg选项(包括 MRU)
 
     TRACE("Before CMultiDocTemplate\n";
     // 注册应用½E‹åºçš„æ–‡æ¡£æ¨¡æÑ€‚文档模 æ?
     // ž®†ç”¨ä½œæ–‡æ¡£ã€æ¡†æž¶çª—å£å’Œè§†å›¾ä¹‹é—´çš„连 æŽ?
     CMultiDocTemplate* pDocTemplate;
     pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE,
         RUNTIME_CLASS(CMDITestDoc),
         RUNTIME_CLASS(CChildFrame), // 自定义 MDIÂ å­æ¡†æž?
         RUNTIME_CLASS(CMDITestView));
     if (!pDocTemplate)
         return FALSE;
     TRACE("Before AddDocTemplate\n";
     AddDocTemplate(pDocTemplate);
 
     // 创å¾ä¸»Â MDI 框架½H—å£
     TRACE("Before new CMainFrame\n";
     CMainFrame* pMainFrame = new CMainFrame;
     TRACE("Before pMainFrame->LoadFrame\n";
     if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
         return FALSE;
     m_pMainWnd = pMainFrame;
 
     TRACE("Before ParseCommandLine\n";
     CCommandLineInfo cmdInfo;
     ParseCommandLine(cmdInfo);
 
     // 调度在命令行中指定的命ä×o。如 æž?
     // 用Â?RegServerã€?Registerã€?Unregserver 或Â?Unregister å¯åŠ¨åº”ç”¨½E‹åºåQŒåˆ™˜q”回 FALSEã€?
     TRACE("Before ProcessShellCommand\n";
     if (!ProcessShellCommand(cmdInfo))
         return FALSE;
 
     TRACE("Before pMainFrame->ShowWindow\n";
     // ä¸Èª—å£å·²åˆå§‹åŒ–,因此昄¡¤ºå®ƒåƈ对其˜q›è¡Œæ›¾b æ–°
     pMainFrame->ShowWindow(m_nCmdShow);
     TRACE("Before pMainFrame->UpdateWindow\n";
     pMainFrame->UpdateWindow();
     return TRUE;
}
 
ä¸ÞZº†ç ”究整个创徘q‡ç¨‹åQŒæˆ‘在其中添加了一些TRACEæ¥è·Ÿítªåˆ›å»ºé¡ºåºã€?
 
忽略掉开始的ä¹×ƒ¸ƒå…«ç³Ÿçš„åˆå§‹åŒ–åQŒä»ŽCMultiDocTemplate开始:
     CMultiDocTemplate* pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE,
         RUNTIME_CLASS(CMDITestDoc),
         RUNTIME_CLASS(CChildFrame), // 自定义 MDIÂ å­æ¡†æž?
         RUNTIME_CLASS(CMDITestView));
     AddDocTemplate(pDocTemplate);
(作了一点点½Ž€åŒ?
˜q™é‡Œé¦–先创å¾äº†ä¸€ä¸ªCMultiDocTemplate -- new CMainFrame;
     if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
         return FALSE;
 

其中åQŒéœ€è¦ç ”½I¶çš„æ˜¯LoadFrame的实玎ͼŒä»¥åŠé‡Œé¢éƒ½åšäº†äº›ä»€ä¹ˆã€‚我们ç¨åŽç ”½I¶ã€?
 
处ç†å‘½ä×o行,在这里第一个空文档被å¾ç«‹å‡ºæ¥ï¼š
     CCommandLineInfo cmdInfo;
     ParseCommandLine(cmdInfo);
 
     // 调度在命令行中指定的命ä×o。如果用 /RegServerã€?Registerã€?Unregserver 或Â?Unregister å¯åŠ¨åº”ç”¨½E‹åºåQŒåˆ™˜q”回 FALSEã€?
     if (!ProcessShellCommand(cmdInfo))               // ? ˜q™é‡Œåˆ›å¾å‡ºåˆå§‹ç©ºæ–‡Â æ¡£
         return FALSE;
 
我们一会会é‡ç‚¹ç ”ç©¶ProcessShellCommandã€?
 
最åŽï¼Œæ˜„¡¤ºä¸Èª—å£ï¼š
     pMainFrame->ShowWindow(m_nCmdShow);
     pMainFrame->UpdateWindow();
 
è‡Ïx­¤åQŒWinApp::InitInstance()完æˆäº†è‡ªå·Þqš„工作ã€?
 
上é¢é—留了三个待研究的分支,让我们现在去研究它们åQ?
1ã€Â Â CDocTemplate
2ã€Â Â CFrameWnd::LoadFrame
3ã€Â Â CWnd::ProcessShellCommand
 
 
 
研究CDocTemplate
 
我们的例å­ä¸­æ˜¯æž„造了一个CMultiDocTemplateåQŒå®ƒæ˜¯ä»ŽCDocTemplate‹z„¡”Ÿè€Œæ¥åQŒæ‰€ä»¥æˆ‘们主 è¦ç ”½I¶CDocTemplateã€?
CDocTemplate的几个关键属性列表如下:
     CRuntimeClass* m_pDocClass;         // class for creating new documents
     CRuntimeClass* m_pFrameClass;       // class for creating new frames
     CRuntimeClass* m_pViewClass;        // class for creating new views
 
其中åQ?
m_pDocClass 表示文æ¡£¾cȱ»åž‹ï¼Œåœ¨æ­¤ä¾‹å­ä¸­å°±æ˜¯CMDITestDoc
m_pFrameClass 表示容纳View½H—å£çš„æ¡†æž¶çª—å£ç±»¾cÕdž‹åQŒæ­¤ä¾‹ä¸­ä¸ºCChildFrame
m_pViewClass 表示昄¡¤ºæ–‡æ¡£çš„View视类¾cÕdž‹åQŒæ­¤ä¾‹ä¸­ä¸ºCMDITestView
 
我们å¯ä»¥˜q™æ ·è®¤äØ“åQŒCDocTemplate用于æè¿°Frame-View-Doc的关¾p…R€‚当然它˜q˜æœ‰ä¸€å¤§å †åˆ«çš„属 性,我们暂时先忽略ã€?
 
一会还会看到CDocTemplateçš„åˆ›å»ºæ–‡æ¡£ã€æ¡†æž¶ã€è§†çš„过½E‹ï¼Œæ”‘Öœ¨ProcessShellCommand中研½I¶ã€?
 
 
研究LoadFrame
 
让我们ç‘ô¾l­ç ”½I¶CFrameWnd::LoadFrame是怎么˜q作的。ä‹É用的æ–ÒŽ³•是跟ítªè¿›å…¥ã€‚。ã€?
BOOL CMDIFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
     CWnd* pParentWnd, CCreateContext* pContext)
{
     // 调用基类 CFrameWnd 的 LoadFrame, pContext 在创å»ÞZ¸»½H—壿—¶Â? NULL
     //   pParentWnd = NULL
     if (!CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
       pParentWnd, pContext))
         return FALSE;
 
     // save menu to use when no active MDI child window is present
     ASSERT(m_hWnd != NULL);
     // ä¸Èª—å£å¸¦æœ‰èœå•,所以。。ã€?
     m_hMenuDefault = ::GetMenu(m_hWnd);
     if (m_hMenuDefault == NULL)
         TRACE(traceAppMsg, 0, "Warning: CMDIFrameWnd without a default menu.\n";
     return TRUE;
}
注æ„åQŒæˆ‘们的MDITest Application的主½H—å£CMainFrame是 从CMDIFrameWnd‹z„¡”Ÿçš„,所以进入到˜q™é‡ŒåQŒå‚考代ç ä¸­¾U¢è‰²çš„æ³¨é‡Šéƒ¨åˆ†ã€‚ç‘ô¾l­è·Ÿítªè¿›å…¥CFrameWnd::LoadFrameã€?
 
BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
     CWnd* pParentWnd, CCreateContext* pContext)
{
     // only do this once
     ASSERT_VALID_IDR(nIDResource);    // nIDResource = 128, IDR_MAINFRAME
     ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource);
 
     m_nIDHelp = nIDResource;    // ID for help context (+HID_BASE_RESOURCE)
 
     CString strFullString;
     if (strFullString.LoadString(nIDResource))  // = "MDITest"
         AfxExtractSubString(m_strTitle, strFullString, 0);    // å–å¾—½W¬ä¸€ä¸ªå­ä¸?
 
     VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
 
     // attempt to create the window
     // GetIconWndClass 会调用 virtual PreCreateWindow 函数åQŒåˆ«å¤„也会调用,从è€?
     // 使得å­ç±»çš„PreCreateWindow ž®†è¢«è°ƒç”¨å¤šæ¬¡
     LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource);
     CString strTitle = m_strTitle;
     // 调用 CFrameWnd::Create() 实际创å¾å‡ºçª— å£ã€?
     // 注æ„åQšåœ¨˜q™é‡Œž®†ç»™Â CMainFrame å‘é€Â WM_CREATE ½{‰å¤šä¸ªæ¶ˆæ¯ã€‚ 触å‘ CMainFrame çš?
     //   OnCreate 处熽{‰ã€?
     if (!Create(lpszClass, strTitle, dwDefaultStyle, rectDefault,
       pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))
     {
         return FALSE;   // will self destruct on failure normally
     }
 
     // save the default menu handleåQŒÂ å¥½åƒÂ CMDIFrameWnd 也ä¿å­˜äº†ä¸€‹Æ¡ï¼Ÿ
     ASSERT(m_hWnd != NULL);
     m_hMenuDefault = ::GetMenu(m_hWnd);
 
     // load accelerator resource
     LoadAccelTable(MAKEINTRESOURCE(nIDResource));
 
     // WM_INITIALUPDATE 是 MFCÂ å‘æ˜Žçš„æ¶ˆæ¯ï¼Œå‚è§åŽÂ é¢çš„说明ã€?
     if (pContext == NULL)   // send initial update
         SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
 
     return TRUE;
}
 
以下是从TN024: MFC-Defined Messages And Resources中抽å–的部分说明åQ?
WM_INITIALUPDATE
This message is sent by the document template to all descendants of a frame window when it is safe for them to do their initial update. It maps to a call to CView::OnInitialUpdate but can be used in other CWnd-derived classes for other one-shot updating.
wParam Not used (0)
lParam Not used (0)
returns Not used (0)

 
归纳一下,LoadFrame中进行了如下事情åQ?
1ã€Â Â æ³¨å†Œçª—å£ç±»(AfxDeferRegisterClass)
2ã€Â Â å®žé™…创建窗å?Create)
3ã€Â Â å¤„ç†èœå•ã€å¿«æ·é”®åQŒå‘é€WM_INITIALUPDATE消毾l™æ‰€æœ‰å­½H—å£ã€‚实际将 在CViewä¸­å¤„ç†æ­¤æ¶ˆæ¯ã€‚(例如åQšåœ¨ToolBarä¸Šé¢æ”¾ä¸€Â ä¸ªFormViewåQŒå¯èƒ½å°±èƒ½æ”¶åˆ°è¿™ä¸ªæ¶ˆæ¯åƈ处利åQŸï¼‰
 
è‡Ïx­¤åQŒCMainFrameå·²ç»æˆåŠŸåˆ›å¾åQŒèœå•å·²¾l装载,工具æ¡ã€çжæ€è¡Œ½{‰å·²¾l在CMainFrame::OnCreate中创建。让我们接ç€ç ”ç©¶½W¬ä¸€ä¸ªå­½H—壿˜¯æ€Žä¹ˆè¢«åˆ›å»ºå‡ºæ¥çš„åQŒè¯¥˜q‡ç¨‹å’ŒCMainFrame::LoadFrame比è“væ¥å°±ä¸é‚£ä¹ˆç›´æŽ¥äº†ã€?
 
 
研究CWnd::ProcessShellCommand
 
½W¬ä¸€ä¸ªMDIå­çª—壿˜¯ä»Žè¿™é‡Œé¢å»ºç«‹å‡ºæ¥çš„,˜q™å®žåœ¨æ˜¯¾~ÞZ¹ç›´è§‚性。丘q‡MFCž®±æ˜¯˜q™æ ·åQŒæ²¡åŠžæ³•ã€‚Â?
BOOL CWinApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo)
{
     BOOL bResult = TRUE;
     switch (rCmdInfo.m_nShellCommand)
     {
     case CCommandLineInfo::FileNew:
         if (!AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL))      // 关键是这�
              OnFileNew();
         if (m_pMainWnd == NULL)
              bResult = FALSE;
         break;
 
     case CCommandLineInfo::FileOpen:                // å¿ãq ç•¥
     case CCommandLineInfo::FilePrintTo:            // 忽略
     case CCommandLineInfo::FilePrint:
     case CCommandLineInfo::FileDDE:
     case CCommandLineInfo::AppRegister:
     case CCommandLineInfo::AppUnregister:
     }
     return bResult;
}
˜q›å…¥åˆ°ProcessShellCommandåQŒè¦å¤„ç†å¾ˆå¤š¿Uä¸åŒå‘½ä»¤ï¼Œæˆ‘们忽略其它命ä×oåQŒå•独看FileNew部分ã€?
注æ„åQšå®žé™…进入到了AfxGetApp()->OnCmdMsg(ID_FILE_NEW, 0, NULL, NULL)之中ã€?
 
AfxGetApp()实际˜q”回了CMDITestApp的唯一实例åQŒå®ƒä»ŽCWinApp - CWinThread - CCmdTarget - CObject ‹z„¡”Ÿè€Œæ¥ã€‚我们没有é‡è½½OnCmdMsgåQŒæ‰€ä»¥è¿›å…¥åˆ°CCmdTargetçš„OnCmdMsg处ç†ä¸­ã€‚äØ“äº†ç ”½IÓž¼Œæˆ‘们删å‡äº†ä¸€äº›ä»£ç ã€?
BOOL CCmdTarget::OnCmdMsg(UINT nID, int nCode, void* pExtra,
     AFX_CMDHANDLERINFO* pHandlerInfo)
{
     // ˜q™é‡Œåˆ å‡äº†ä¸€äº›ä»£ç ?
     // determine the message number and code (packed into nCode)
     const AFX_MSGMAP* pMessageMap;
     const AFX_MSGMAP_ENTRY* lpEntry;
     UINT nMsg = 0;
     // ˜q™é‡Œåˆ å‡äº†ä¸€äº›ä»£ç ï¼Œå¤„ç†åŽÂ nMsg = WM_COMMAND
     // ä¸ÞZº†½Ž€åŒ–,删å‡äº†ä¸€äº›æ–­­a€½{‰ã€‚以下åó@环用于查扑֤„ç†æ­¤æ¶ˆæ¯çš„ 入å£ã€?
     for (pMessageMap = GetMessageMap(); pMessageMap->pfnGetBaseMap != NULL;
       pMessageMap = (*pMessageMap->pfnGetBaseMap)())
     {
         lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries, nMsg, nCode, nID);
         if (lpEntry != NULL)
         {
              // 扑ֈ°äº†æ¶ˆæ¯å¤„ç†é¡¹å…¥å£åQŒåˆ†å‘此消æ¯ã€?
              return _AfxDispatchCmdMsg(this, nID, nCode,
lpEntry->pfn, pExtra, lpEntry->nSig, pHandlerInfo);
         }
     }
     return FALSE;   // 未找到则ä¸å¤„ç?
}
最¾lˆMFC很愉快地扑ֈ°äº†ä¸€ä¸ªå…¥å£é¡¹åQŒÂ Â Â Â Â Â Â CWinApp::OnFileNew(void)       è¦å¤„ç†è¿™ä¸ªæ¶ˆæ¯ã€‚ç‘ô¾l­è¿›å…¥åˆ°_AfxDispatchCmdMsg中去看看ã€?
 
AFX_STATIC BOOL AFXAPI _AfxDispatchCmdMsg(CCmdTarget* pTarget, UINT nID, int nCode,
     AFX_PMSG pfn, void* pExtra, UINT_PTR nSig, AFX_CMDHANDLERINFO* pHandlerInfo)
         // return TRUE to stop routing
{
     union MessageMapFunctions mmf;
     mmf.pfn = pfn;
     BOOL bResult = TRUE; // default is ok
 
     if (pHandlerInfo != NULL)
     {
         // just fill in the information, don't do it
         pHandlerInfo->pTarget = pTarget;
         pHandlerInfo->pmf = mmf.pfn;
         return TRUE;
     }
 
     switch (nSig)
     {
     case AfxSigCmd_v:
         // normal command or control notification
         ASSERT(CN_COMMAND == 0);        // CN_COMMAND same as BN_CLICKED
         ASSERT(pExtra == NULL);
         (pTarget->*mmf.pfnCmd_v_v)();         // ? 实际调用 pTarget 指å‘ 的这个æˆå‘˜å‡½æ•?
         break;
     // 下题q˜æœ‰å¤§é‡çš„多¿U AfxSigCmd_xxxåQŒå¿½ç•¥æŽ‰å®ƒä»¬ã€?
     default:    // illegal
         ASSERT(FALSE); return 0; break;
     }
     return bResult;
}
 
其中 (pTarget->*mmf.pfn_Cmd_v_v)() 对CWinApp::OnFileNew() 产生调 用åQŒpTarget = CMDITestApp¾cÕd®žä¾‹ã€‚调用进入如下:
 
void CWinApp::OnFileNew()
{
     if (m_pDocManager != NULL)
         m_pDocManager->OnFileNew();
}
 
˜q›å…¥˜q›å…¥åˆ°CDocManager::OnFileNew()
 
void CDocManager::OnFileNew()
{
     if (m_templateList.IsEmpty())
          // æç¤ºæ²¡æœ‰æ¨¡æ¿òq¶è¿”å›?
     CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();    // ½W¬ä¸€ä¸?
     if (m_templateList.GetCount() > 1)
          //Â å¼¹å‡ºä¸€ä¸ªå¯¹è¯æ¡†åQˆå¾ˆéš„¡œ‹çš„)æç¤ºç”¨æˆ·é€‰æ‹©ä¸€ä¸ªæ–‡æ¡£æ¨¡æ?
 
     // 在这个例å­é‡Œé¢ï¼ŒpTemplate ž®±æ˜¯Â CMDITestApp::InitInstance() 里é¢åˆ›å¾çš„那个模æ?
     pTemplate->OpenDocumentFile(NULL);
}
 
在进入CMultiDocTemplate::OpenDocumentFile之å‰åQŒæˆ‘观察了一下调用堆栈,¾l“果如下åQ?
>   mfc71d.dll!CDocManager::OnFileNew()  852  C++
    mfc71d.dll!CWinApp::OnFileNew()  行�5   C++
    mfc71d.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x0042cae8, unsigned int nID=57600, int nCode=0, void (void)* pfn=0x0041153c, void * pExtra=0x00000000, unsigned int nSig=53, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000)  �9   C++
    mfc71d.dll!CCmdTarget::OnCmdMsg(unsigned int nID=57600, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000)  396 + 0x27    C++
    mfc71d.dll!CWinApp::ProcessShellCommand(CCommandLineInfo & rCmdInfo={...})  �7 + 0x1e C++
    MDITest.exe!CMDITestApp::InitInstance()  行�01 + 0xc    C++
希望我还没有˜q¯‚µ\åQšï¼‰
 
 
CMultiDocTemplate::OpenDocumentFileÂ åˆæ˜¯å¾ˆå¤šå¾ˆå¤šä»£ç åQŒè®©æˆ‘们选择一些ã€?
CDocument* CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
     BOOL bMakeVisible)
{
     // 以下代ç åˆ å‡äº†éªŒè¯ã€æ–­­a€éƒ¨Â åˆ†
     CDocument* pDocument = CreateNewDocument();              //Â åˆ›å¾æ–‡æ¡£å¯¹è±¡
     CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);    //Â åˆ›å¾æ¡†æž¶½H—å£
 
     if (lpszPathName == NULL)
     {
         pDocument->OnNewDocument();           // åˆå§‹åŒ–æ–‡æ¡?
     }
     else
          // 打开已有文æ¡£
 
     InitialUpdateFrame(pFrame, pDocument, bMakeVisible);
     return pDocument;
}
 
 
看一看CreateNewDocument()
CDocument* CDocTemplate::CreateNewDocument()
{
     // default implementation constructs one from CRuntimeClass
     if (m_pDocClass == NULL)
          // 错误æç¤ºå•?
     // CRuntimeClass* m_pDocClass -> CreateObject 实例化文档 类ã€?
     // 在此例å­ä¸­æ—¢æ˜¯Â CMDITestDoc
     CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();
     AddDocument(pDocument);      // æ·ÕdŠ åˆ°æ¨¡æ‰K‡Œçš„æ–‡æ¡£åˆ—表,MultiDocTemplate ä¿å­˜æ­¤ä¸€æ–‡Â æ¡£
     return pDocument;
}
 
 
CMDITestDoc有如下的定义åQŒä»…能从CRuntimeClass里é¢åˆ›å¾çš„ã€?
class CMDITestDoc : public CDocument
{
protected: // 仅从åºåˆ—化创å»?
     CMDITestDoc();               //Â è¢«ä¿æŠ¤çš„æž„é€ å‡½æ•?
     DECLARE_DYNCREATE(CMDITestDoc)             // 支æŒä»ŽÂ CRuntimeClass 信æ¯ä¸­åˆ›å»ºã€?
 
 
å†æŽ¥ç€˜q›è¡ŒCreateNewFrameã€?
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)
{
     // create a frame wired to the specified document
     CCreateContext context;           // ˜q™ä¸ªÂ CreateContext 传递到 LoadFrame ä¸?
     context.m_pCurrentFrame = pOther;         // 此例中� NULL
     context.m_pCurrentDoc = pDoc;              // = 刚æ‰åˆ›å¾çš„æ–‡æ¡?
     context.m_pNewViewClass = m_pViewClass;   // 昄¡¤ºæ­¤æ–‡æ¡£çš„视类的类åž?
     context.m_pNewDocTemplate = this;
 
     if (m_pFrameClass == NULL)
          // æç¤ºé”™è¯¯òq¶è¿”å›?
     // 利用 CRuntimeClass 信æ¯åˆ›å¾æ¡†æž¶½H—å£å¯¹è±¡åQŒæ­¤ä¾‹ä¸­ä¸ºÂ CChildFrame
     CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();
 
     // ˜q™é‡ŒåQŒæˆ‘们åˆçœ‹åˆ°äº†Â LoadFrame , å‚考å‰é¢çš„ LoadFrame å?
     // 在这里é¢åQŒView ½H—å£ä¹Ÿè¢«äº§ç”Ÿå‡ºæ¥ã€‚å‚考 TRACE 输 出ã€?
     pFrame->LoadFrame(m_nIDResource,
              WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles
              NULL, &context);
     return pFrame;
}
 
 
LoadFrame之åŽView½H—壞®†è¢«åˆ›å¾å‡ºæ¥åQŒæŽ¥ç€˜q›å…¥Â åˆ°CMDITestDoc::OnNewDocument中,现在仅仅是一个空的函敎ͼŒæ²¡æœ‰ç‰¹å®šä»£ç ã€?
BOOL CMDITestDoc::OnNewDocument()
{
   TRACE("CMDITestDoc::OnNewDocument() entry\n";
     if (!CDocument::OnNewDocument())
         return FALSE;
 
     // TODO: 在此æ·ÕdР釿–°åˆå§‹åŒ–代 ç ?
     // (SDI 文档ž®†é‡ç”¨è¯¥æ–‡æ¡£)
 
     return TRUE;
}
 
æœ€åŽæ˜¯CDocTemplate::InitialUpdateFrameåQŒè¿™é‡Œé¢ä¸»è¦æ˜¯æ¿€‹zÀL–°å»ºçš„æ¡†æž¶ã€æ–‡æ¡£ã€è§†åQŒçœ‹å¾—挺头疼的ã€?
void CDocTemplate::InitialUpdateFrame(CFrameWnd* pFrame, CDocument* pDoc,
     BOOL bMakeVisible)
{
     // just delagate to implementation in CFrameWnd
     pFrame->InitialUpdateFrame(pDoc, bMakeVisible);
}
 
现在åQŒæ–‡æ¡£ã€æ¡†æž¶çª—å£ã€è§†½H—å£å…¨éƒ¨è¢«åˆ›å»ºå‡ºæ¥ï¼Œæˆ‘们胜利的返回到ProcessShellCommand处。显½Cºå’Œæ›´æ–°ä¸Èª—å£ï¼Œå®Œæˆäº†WinApp::InitInstance åQ?
     // ä¸Èª—å£å·²åˆå§‹åŒ–,因此昄¡¤ºå®ƒåƈ对其˜q›è¡Œæ›¾b æ–°
     pMainFrame->ShowWindow(m_nCmdShow);
     pMainFrame->UpdateWindow();
 
 
 
看一下至此的TRACE输出åQŒä¸­é—´çš„DLL加è²è¢«åŽ»æŽ‰äº†åQ?
Before CMultiDocTemplate
Before AddDocTemplate
Before new CMainFrame
CMainFrame::CMainFrame()
Before pMainFrame->LoadFrame
CMainFrame::PreCreateWindow entry         // 注æ„åQšPreCreateWindow 被两‹Æ¡è°ƒç”?
CMainFrame::PreCreateWindow entry
CMainFrame::OnCreate entry before CMDIFrameWnd::OnCreate
CMainFrame::OnCreate before m_wndToolBar.CreateEx
CMainFrame::OnCreate before m_wndStatusBar.Create
Before ParseCommandLine
Before ProcessShellCommand
CMDITestDoc::CMDITestDoc()       // 文档对象被创å»?
CChildFrame::CChildFrame()       //Â å­æ¡†æž¶çª—å£è¢«åˆ›å¾
CChildFrame::PreCreateWindow entry 
CChildFrame::PreCreateWindow entry
CChildFrame::PreCreateWindow entry
CMDITestView::CMDITestView() entry   //Â å­æ¡†æž¶çª—å£çš„ OnCreate 中创å»ÞZº†Â View ½H—å£
CMDITestView::PreCreateWindow entry
CMDITestDoc::OnNewDocument() entry
Before pMainFrame->ShowWindow
Before pMainFrame->UpdateWindow
 
// 退出时的 TRACE
CMDITestView::~CMDITestView()
CChildFrame::~CChildFrame()
CMDITestDoc::~CMDITestDoc()
CMainFrame::~CMainFrame()


ž®ä¸æ‡‚^_^ 2007-03-22 19:34 å‘表评论
]]>
¹ú²úÒ»Çø¶þÇø¾«Æ·¾Ã¾ÃÔÀ| ÎÞÂ뾫Ʒ¾Ã¾Ã¾Ã¾Ã¾ÃÈËÆÞÖÐ×Ö| ÑÇÖÞÂÒÂ뾫Ʒ¾Ã¾Ã¾Ã¾Ã..| ÑÇÖÞÖÐÎľþþ«Æ·ÎÞÂëww16 | ¾«Æ·ÈËÆÞ¾Ã¾Ã¾Ã¾Ã¾Ã888| ¾«Æ·¾Å¾Å¾Ã¾Ã¹úÄÚ¾«Æ·| ÑÇÖÞÅ·ÃÀÒ»Çø¶þÇøÈýÇø¾Ã¾Ã| ¾Ã¾ÃZYZ×ÊÔ´Õ¾ÎÞÂëÖÐÎ͝Âþ| 99¾Ã¾Ã¾«Æ·ÎÞÂëÒ»Çø¶þÇøÃ«Æ¬| ¾Ã¾Ã¾Ã¾Ã¾Ã¾ÃÑÇÖÞ¾«Æ·| ¾Ã¾Ã¾Ã¾Ã¾ÃÈËÆÞÎÞÂë| ¾Ã¾Ã¾Ã¾Ã¾Ã¾Ã¾Ã¾Ã¾ÃÃâ·Ñ¾«Æ·| ¾Ã¾ÃÎçÒ¹Â׳ƬÃâ·ÑÎÞÂë| ÈËÆÞϵÁÐÎÞÂë×¨Çø¾Ã¾ÃÎåÔÂÌì| ¾Ã¾Ã¾Ã¾ÃÑÇÖÞAVÎÞÂë×¨ÇøÊ×JN | ÎÞÂ뾫Ʒ¾Ã¾Ã¾ÃÌìÌìÓ°ÊÓ| Å·ÃÀ777¾«Æ·¾Ã¾Ã¾Ã¾ÃÍø| ÑÇÖÞÉ«Óû¾Ã¾Ã¾Ã×ÛºÏÍø¶«¾©ÈÈ| ¾Ã¾Ã¾Ã¾«Æ·²¨¶àÒ°½áÒÂ| ¾Ã¾Ã91¾«Æ·¹ú²ú91¾Ã¾Ã»§| ÑÇÖÞ×ÛºÏÈÕº«¾Ã¾Ã³ÉÈËAV| ÃÛÌÒÂé¶¹www¾Ã¾Ã¹ú²ú¾«Æ·| ÈÕ±¾µÀÉ«×ۺϾþÃÓ°Ôº| ¾Ã¾ÃÈËÆÞÉÙ¸¾ÄÛ²ÝAVÎÞÂë×¨Çø| ¹úÄÚ¾«Æ·¾Ã¾Ã¾Ã¾ÃÓ°ÔºÑÇÖÞ| 2021¹ú²ú³ÉÈ˾«Æ·¾Ã¾Ã| ¹ú²ú¾«Æ·¾Ã¾ÃÎçÒ¹Ò¹Â׳³| ºÝºÝÉ«¶¡Ïã¾Ã¾ÃæÃæÃ×ÛºÏ| ÈÕº«ÈËÆÞÎÞÂëÒ»Çø¶þÇøÈýÇø¾Ã¾Ã99 | ¾Ã¾Ã´óÏãÏã½¶¹ú²ú| Ò»±¾É«µÀ¾Ã¾Ã88×ÛºÏÈÕº«¾«Æ· | ÇàÇà²ÝÔ­×ۺϾþôóÒÁÈ˾«Æ·| ÑÇÖÞÅ·ÃÀÈÕº«ÖÐÎľþÃ| ÑÇÖÞ¹ú²ú¾«Æ·³ÉÈ˾þÃ| ÎÞÂë¹úÄÚ¾«Æ·¾Ã¾ÃÈËÆÞ| ÑÇÖÞºÝºÝæÃæÃ×ۺϾþÃÃÛÑ¿| ÑÇÖÞÅ·ÖÞ¾«Æ·³ÉÈË¾Ã¾ÃÆæÃ×Íø| ¾«Æ·¹ú²úÂÒÂë¾Ã¾Ã¾Ã¾ÃÈí¼þ| ÑÇÖÞÈ˳ÉÎÞÂëwww¾Ã¾Ã¾Ã| ¾Ã¾Ã99ÈÈÕâÀïֻƵ¾«Æ·6| ¾Ã¾Ã×ۺϺݺÝ×ۺϾþÃ|