Dll入口函數參數詳解...


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

函數原型:

 

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}


參數意義:

 

①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參數:保留,目前沒什么意義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM