Dll入口函数参数详解
DLL程序入口點(diǎn)函數(shù):DllMain,注意:大小寫(xiě)是區(qū)別的(僅導(dǎo)出資源的DLL可以沒(méi)有DllMain函數(shù))。
函數(shù)原型:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }參數(shù)意義:
①hModule參數(shù):指向DLL本身的實(shí)例句柄;
②ul_reason_for_call參數(shù):指明了DLL被調(diào)用的原因,可以有以下4個(gè)取值:
當(dāng)DLL被進(jìn)程 <<第一次>> 調(diào)用時(shí),導(dǎo)致DllMain函數(shù)被調(diào)用,
同時(shí)ul_reason_for_call的值為DLL_PROCESS_ATTACH,
如果同一個(gè)進(jìn)程后來(lái)再次調(diào)用此DLL時(shí),操作系統(tǒng)只會(huì)增加DLL的使用次數(shù),
不會(huì)再用DLL_PROCESS_ATTACH調(diào)用DLL的DllMain函數(shù)。
2.DLL_PROCESS_DETACH:
當(dāng)DLL被從進(jìn)程的地址空間解除映射時(shí),系統(tǒng)調(diào)用了它的DllMain,傳遞的ul_reason_for_call值是DLL_PROCESS_DETACH。
★如果進(jìn)程的終結(jié)是因?yàn)檎{(diào)用了TerminateProcess,系統(tǒng)就不會(huì)用DLL_PROCESS_DETACH來(lái)調(diào)用DLL的DllMain函數(shù)。這就意味著DLL在進(jìn)程結(jié)束前沒(méi)有機(jī)會(huì)執(zhí)行任何清理工作。
3.DLL_THREAD_ATTACH:
當(dāng)進(jìn)程創(chuàng)建一線程時(shí),系統(tǒng)查看當(dāng)前映射到進(jìn)程地址空間中的所有DLL文件映像,
并用值DLL_THREAD_ATTACH調(diào)用DLL的DllMain函數(shù)。
新創(chuàng)建的線程負(fù)責(zé)執(zhí)行這次的DLL的DllMain函數(shù),
只有當(dāng)所有的DLL都處理完這一通知后,系統(tǒng)才允許線程開(kāi)始執(zhí)行它的線程函數(shù)。
4.DLL_THREAD_DETACH:
如果線程調(diào)用了ExitThread來(lái)結(jié)束線程(線程函數(shù)返回時(shí),系統(tǒng)也會(huì)自動(dòng)調(diào)用ExitThread),
系統(tǒng)查看當(dāng)前映射到進(jìn)程空間中的所有DLL文件映像,
并用DLL_THREAD_DETACH來(lái)調(diào)用DllMain函數(shù),
通知所有的DLL去執(zhí)行線程級(jí)的清理工作。
★注意:如果線程的結(jié)束是因?yàn)橄到y(tǒng)中的一個(gè)線程調(diào)用了TerminateThread,
系統(tǒng)就不會(huì)用值DLL_THREAD_DETACH來(lái)調(diào)用所有DLL的DllMain函數(shù)。
③lpReserved參數(shù):保留,目前沒(méi)什么意義。
總結(jié)
以上是生活随笔為你收集整理的Dll入口函数参数详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VC++动态链接库(DLL)编程深入浅出
- 下一篇: NC反弹的小demo