DllMain

DLL程序入口點函數:DllMain注意:大小寫是區別的(僅導出資源的DLL可以沒有DllMain函數)。

函數原型:

  1. BOOL APIENTRY DllMain( HMODULE hModule,  
  2.                        DWORD  ul_reason_for_call,  
  3.                        LPVOID lpReserved  
  4.                      )  
  5. {  
  6.     return TRUE;  
  7. }  

參數意義:

hModule參數:指向DLL本身的實例句柄;


ul_reason_for_call參數:指明瞭DLL被調用的原因,可以有以下4個取值:


1. 
DLL_PROCESS_ATTACH
當DLL被進程 <<第一次>> 調用時,導致DllMain函數被調用,

同時ul_reason_for_call的值爲DLL_PROCESS_ATTACH

如果同一個進程後來再次調用此DLL時,操作系統只會增加DLL的使用次數,

不會再用DLL_PROCESS_ATTACH調用DLL的DllMain函數。


2.
DLL_PROCESS_DETACH
當DLL被從進程的地址空間解除映射時,系統調用了它的DllMain,傳遞的ul_reason_for_call值是DLL_PROCESS_DETACH。
★如果進程的終結是因爲調用了TerminateProcess,系統就不會用DLL_PROCESS_DETACH來調用DLL的DllMain函數。這就意味着DLL在進程結束前沒有機會執行任何清理工作。


3.DLL_THREAD_ATTACH
當進程創建一線程時,系統查看當前映射到進程地址空間中的所有DLL文件映像,

並用值DLL_THREAD_ATTACH調用DLL的DllMain函數。 

新創建的線程負責執行這次的DLL的DllMain函數,

只有當所有的DLL都處理完這一通知後,系統才允許線程開始執行它的線程函數。


4.
DLL_THREAD_DETACH
如果線程調用了ExitThread來結束線程(線程函數返回時,系統也會自動調用ExitThread),

系統查看當前映射到進程空間中的所有DLL文件映像,

並用DLL_THREAD_DETACH來調用DllMain函數,

通知所有的DLL去執行線程級的清理工作。
★注意:如果線程的結束是因爲系統中的一個線程調用了TerminateThread,

系統就不會用值DLL_THREAD_DETACH來調用所有DLL的DllMain函數。


lpReserved參數:保留,目前沒什麼意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章