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