DllMain璇﹁В
1 DLL鐨勮繘鍏?閫鍑哄嚱鏁?/p>
1.1 DllMain綆浠?/p>
璺焑xe鏈変釜main鎴栬匴inMain鍏ュ彛鍑芥暟涓鏍鳳紝DLL涔熸湁涓涓叆鍙e嚱鏁幫紝灝辨槸DllMain銆備互“DllMain”涓哄叧閿瓧錛屾潵鐪嬬湅MSDN甯姪鏂囨。鎬庝箞浠嬬粛榪欎釜鍑芥暟鐨勩?/p>
The DllMain function is an optional method of entry into a dynamic-link library (DLL)銆傦紙綆瑕佺炕璇戯細瀵逛簬鍔ㄦ侀摼鎺ュ簱錛孌llMain鏄竴涓彲閫夌殑鍏ュ彛鍑芥暟銆傦級榪欏彞璇濆緢閲嶈錛屽緢澶氬垵瀛﹁呭彲鑳介兘璁や負涓涓姩鎬侀摼鎺ュ簱鑲畾瑕佹湁 DllMain鍑芥暟銆傚叾瀹炰笉鐒訛紝鍍忓緢澶氫粎浠呭寘鍚祫婧愪俊鎭殑DLL鏄病鏈塂llMain鍑芥暟鐨勩?/p>
1.2 浣曟椂璋冪敤DllMain
緋葷粺鏄湪浠涔堟椂鍊欒皟鐢―llMain鍑芥暟鐨勫憿錛熼潤鎬侀摼鎺ユ椂錛屾垨鍔ㄦ侀摼鎺ユ椂璋冪敤LoadLibrary鍜孎reeLibrary閮戒細璋冪敤DllMain鍑芥暟銆侱llMain鐨勭涓変釜鍙傛暟fdwReason鎸囨槑浜嗙郴緇熻皟鐢―ll鐨勫師鍥狅紝瀹冨彲鑳芥槸:
DLL_PROCESS_ATTACH銆?/font>
DLL_PROCESS_DETACH銆?/font>
DLL_THREAD_ATTACH
DLL_THREAD_DETACH銆?/font>
浠ヤ笅浠庤繖鍥涚鎯呭喌鏉ュ垎鏋愮郴緇熶綍鏃惰皟鐢ㄤ簡DllMain銆?nbsp;
1.2.1 DLL_PROCESS_ATTACH
澶у閮界煡閬擄紝涓涓▼搴忚璋冪敤Dll閲岀殑鍑芥暟錛岄鍏堣鍏堟妸DLL鏂囦歡鏄犲皠鍒拌繘紼嬬殑鍦板潃絀洪棿銆傝鎶婁竴涓狣LL鏂囦歡鏄犲皠鍒拌繘紼嬬殑鍦板潃絀洪棿錛屾湁涓ょ鏂規硶錛氶潤鎬侀摼鎺ュ拰鍔ㄦ侀摼鎺ョ殑LoadLibrary鎴栬匧oadLibraryEx銆?/p>
褰撲竴涓狣LL鏂囦歡琚槧灝勫埌榪涚▼鐨勫湴鍧絀洪棿鏃訛紝緋葷粺璋冪敤璇LL鐨凞llMain鍑芥暟錛屼紶閫掔殑fdwReason鍙傛暟涓? DLL_PROCESS_ATTACH銆傝繖縐嶈皟鐢ㄥ彧浼氬彂鐢熷湪絎竴嬈℃槧灝勬椂銆傚鏋滃悓涓涓繘紼嬪悗鏉ヤ負宸茬粡鏄犲皠榪涙潵鐨凞LL鍐嶆璋冪敤LoadLibrary鎴栬? LoadLibraryEx錛屾搷浣滅郴緇熷彧浼氬鍔燚LL鐨勪嬌鐢ㄦ鏁幫紝瀹冧笉浼氬啀鐢―LL_PROCESS_ATTACH璋冪敤DLL鐨凞llMain鍑芥暟銆備笉鍚? 榪涚▼鐢↙oadLibrary鍚屼竴涓狣LL鏃訛紝姣忎釜榪涚▼鐨勭涓嬈℃槧灝勯兘浼氱敤DLL_PROCESS_ATTACH璋冪敤DLL鐨凞llMain鍑芥暟銆?/p>
鍙弬鑰僁llMainTest鐨凞LL_PROCESS_ATTACH_Test鍑芥暟銆?/p>
1.2.2 DLL_PROCESS_DETACH
褰揇LL琚粠榪涚▼鐨勫湴鍧絀洪棿瑙i櫎鏄犲皠鏃訛紝緋葷粺璋冪敤浜嗗畠鐨凞llMain錛屼紶閫掔殑fdwReason鍊兼槸DLL_PROCESS_DETACH銆傚綋DLL澶勭悊璇ュ兼椂錛屽畠搴旇鎵ц榪涚▼鐩稿叧鐨勬竻鐞嗗伐浣溿?/p>
閭d箞浠涔堟椂鍊橠LL琚粠榪涚▼鐨勫湴鍧絀洪棿瑙i櫎鏄犲皠鍛紵涓ょ鎯呭喌錛?/p>
鈼咶reeLibrary瑙i櫎DLL鏄犲皠錛?font color="#ff0000">鏈夊嚑涓狶oadLibrary錛屽氨瑕佹湁鍑犱釜FreeLibrary錛?/p>
鈼嗚繘紼嬬粨鏉熻岃В闄LL鏄犲皠錛屽湪榪涚▼緇撴潫鍓嶈繕娌℃湁瑙i櫎DLL鐨勬槧灝勶紝榪涚▼緇撴潫鍚庝細瑙i櫎DLL鏄犲皠銆傦紙濡傛灉榪涚▼鐨勭粓緇撴槸鍥犱負璋冪敤浜? TerminateProcess錛岀郴緇熷氨涓嶄細鐢―LL_PROCESS_DETACH鏉ヨ皟鐢―LL鐨凞llMain鍑芥暟銆傝繖灝辨剰鍛崇潃DLL鍦ㄨ繘紼嬬粨鏉熷墠 娌℃湁鏈轟細鎵ц浠諱綍娓呯悊宸ヤ綔銆傦級
娉ㄦ剰錛氬綋鐢―LL_PROCESS_ATTACH璋冪敤DLL鐨凞llMain鍑芥暟鏃訛紝濡傛灉榪斿洖FALSE錛岃鏄庢病鏈夊垵濮嬪寲鎴愬姛錛岀郴緇熶粛浼氱敤DLL_PROCESS_DETACH璋冪敤DLL鐨凞llMain鍑芥暟銆傚洜姝わ紝蹇呴』紜繚娓呯悊閭d簺娌℃湁鎴愬姛鍒濆鍖栫殑涓滆タ銆?/font>
鍙弬鑰僁llMainTest鐨凞LL_PROCESS_DETACH_Test鍑芥暟銆?/p>
1.2.3 DLL_THREAD_ATTACH
褰撹繘紼嬪垱寤轟竴綰跨▼鏃訛紝緋葷粺鏌ョ湅褰撳墠鏄犲皠鍒拌繘紼嬪湴鍧絀洪棿涓殑鎵鏈塂LL鏂囦歡鏄犲儚錛屽茍鐢ㄥ糄LL_THREAD_ATTACH璋冪敤DLL鐨凞llMain鍑芥暟銆?/p>
鏂板垱寤虹殑綰跨▼璐熻矗鎵ц榪欐鐨凞LL鐨凞llMain鍑芥暟錛屽彧鏈夊綋鎵鏈夌殑DLL閮藉鐞嗗畬榪欎竴閫氱煡鍚庯紝緋葷粺鎵嶅厑璁歌繘紼嬪紑濮嬫墽琛屽畠鐨勭嚎紼嬪嚱鏁般?/p>
娉ㄦ剰璺烡LL_PROCESS_ATTACH鐨勫尯鍒紝鎴戜滑鍦ㄥ墠闈㈣榪囷紝絎? n(n>=2)嬈′互鍚庡湴鎶奃LL鏄犲儚鏂囦歡鏄犲皠鍒拌繘紼嬬殑鍦板潃絀洪棿鏃訛紝鏄笉鍐嶇敤DLL_PROCESS_ATTACH璋冪敤DllMain鐨勩傝? DLL_THREAD_ATTACH涓嶅悓錛岃繘紼嬩腑鐨勬瘡嬈″緩绔嬬嚎紼嬶紝閮戒細鐢ㄥ糄LL_THREAD_ATTACH璋冪敤DllMain鍑芥暟錛屽摢鎬曟槸綰跨▼涓緩绔? 綰跨▼涔熶竴鏍楓?/p>
1.2.4 DLL_THREAD_DETACH
濡傛灉綰跨▼璋冪敤浜咵xitThread鏉ョ粨鏉熺嚎紼嬶紙綰跨▼鍑芥暟榪斿洖鏃訛紝緋葷粺涔熶細鑷姩璋冪敤ExitThread錛夛紝緋葷粺鏌ョ湅褰撳墠鏄犲皠鍒拌繘紼嬬┖闂翠腑鐨勬墍鏈塂LL鏂? 浠舵槧鍍忥紝騫剁敤DLL_THREAD_DETACH鏉ヨ皟鐢―llMain鍑芥暟錛岄氱煡鎵鏈夌殑DLL鍘繪墽琛岀嚎紼嬬駭鐨勬竻鐞嗗伐浣溿?/p>
娉ㄦ剰錛氬鏋滅嚎紼嬬殑緇撴潫鏄洜涓虹郴緇熶腑鐨勪竴涓嚎紼嬭皟鐢ㄤ簡TerminateThread錛岀郴緇熷氨涓嶄細鐢ㄥ糄LL_THREAD_DETACH鏉ヨ皟鐢ㄦ墍鏈塂LL鐨凞llMain鍑芥暟銆?/p>
1.3 涓篋llMain鎹㈠悕
鍦ㄦ棭鏈熺殑SDK鐗堟湰涓紝DllMain鏄彨鍋欴llEntryPoint銆傚叾瀹炴湁涓浠墮矞涓轟漢 鐭ョ殑浜嬶細涓涓狣ll鐨勫叆鍙e嚱鏁板悕鏄彲浠ヨ嚜宸卞畾涔夌殑銆備笅闈㈡垜灝嗕互VC++6.0涓轟緥鏉ユ紨紺哄浣曟洿鏀廣傞鍏堣璇存槑涓鐐癸紝铏界劧DllMain鍙互鎹㈡垚鍏朵粬鍑芥暟 鍚嶏紝浣嗗嚱鏁扮殑鍙傛暟鍜岃繑鍥炲煎繀欏誨拰DllMain涓鏍楓傝屼笖榪欎釜鍑芥暟瑕佷負__stdcall綾誨瀷錛圖llMain鏈韓涔熸槸__stdcall綾誨瀷錛夈?/p>
鎵撳紑VC++鑿滃崟Project"Settings"Link tab" Output in the Category box錛屽涓嬪浘錛屽湪Entry-point symbol涓緭鍏ヨ鏇挎崲DllMain鐨勫嚱鏁板悕錛堝綋鐒惰繖涓嚱鏁板悕鏄綘紼嬪簭涓凡緇忓疄鐜扮殑鍑芥暟錛夈侲ntry-point symbol鏄共涔堢殑鍛紵鍙互浠ュ叧閿瓧“Entry-point symbol”鎼滅儲MSDN甯姪鏂囨。鏌ョ湅錛屾悳绱㈡椂錛屾墦閽?#8220;浠呮悳绱㈡爣棰?#8221;浼氭洿蹇畾浣嶃?/p>
鎸塐K鍚庯紝濡傛灉椹笂緙栬瘧鐨勮瘽浼氬嚭鐜板涓嬮敊璇細
LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Dll.dll : fatal error LNK1120: 1 unresolved externals
鎵撳紑VC++鑿滃崟Project"Settings"C/C++閫夐」鍗★紝濡備笅鍥撅紝鍦? Project Options錛氭湯灝劇殑鍦版柟娣誨姞”/D”錛堝浘涓摑鑹查珮浜殑鍦版柟錛夛紝瑕佹敞鎰忎綅緗紝鎴戣瘯浜嗭紝瑕佹妸/D鏀懼埌/GZ鍚庨潰涔熶細閾炬帴閿欒錛屾垜涔熶笉鎳備負浠涔堬紝^_^銆傛寜 OK錛屽啀嬈$紪璇戯紝鎴愬姛銆傚ぇ瀹跺彲浠ヨ嚜宸辨祴璇曚笅鍒板簳鏈夋病鏈夋洿鏀規垚鍔燂紝浠涔堬紝濡傛灉嫻嬭瘯錛熸墦鍑鴻皟寮忎俊鎭晩銆?/p>
1.4 DisableThreadLibraryCalls
鐪嬪府鍔╁氨鐭ラ亾瀹冩槸騫蹭箞鐢ㄧ殑錛?/p>
The DisableThreadLibraryCalls function
disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for
the dynamic-link library (DLL) specified by hLibModule. This can reduce
the size of the working co
杞嚜:http://blog.csdn.net/benkaoya/archive/2008/06/02/2504781.aspx