dll通告消息

本文深入探讨了DLL加载机制,包括DLLMAIN函数的作用及其调用时机,如何使用DISABLETHREADLIBRARYCALLS来抑制通告消息,以及动态加载DLL时DLL_THREAD_ATTACH消息的发送特性。此外还介绍了MFC DLL的初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、当一个进程载入或卸载一个DLL时,DLLMAIN会被调用(DLLMAIN获得DLL_PROCESS_ATTACH消息),线程也是一样(获得DLL_THREAD_ATTACH消息)

BOOL WINAPI DLLMAIN(
HANDLE hinstDll,//DLL的MOUDULE HANDLE
DWORDfdwReason,//被调用的原因,可能是DLL_PROCESS_ATTACH,DLL_THREAD_ATTACH
//DLL_THREAD_DETACH,DLL_PROCESS_DETACH
LPVOID lpRerved//可以为DLL_PROCESS_ATTACH
);
2、抑制通告消息
DLLMAIN被自动调用(以单线程为例,进程一次,线程一次),DLLMAIN()在新线程的CONTEXT中被调用,如何减轻这些负担呢,使用抑制通告消息。
BOOL DISABLETHREADLIBRARYCALLS(
HMODULE hLibModule//DLL的MODULE HANDLE
)
3、TreminateThread阻止了DLL通告消息可以会留下已附着的DLLS
 
4、动态加载
一个DLL被LOADLIBRARY或LOADLIBRARYEX动态载入时,DLLMAIN不会收到在执行中的线程的DLL_THREAD_ATTACH通告消息,但只有调用LOADLIBRARY的那一个可以收到。而且DLLMAIN可以收到所有那些线程的DLL_THREAD_DETACH通告消息
5、总结
(1)进程调用LOADLIBRARY时,有一个以下的线程正在运行,那么DLL_THREAD_ATTACHI不会针对每一个线程送出,但只有调用LOADLIBRARY的那一个可以送出
(2)DLLMAIN不会接受第一个线程的DLL_THREAD_ATTACH,而以DLL_PROCESS_ATTACH取代之
(3)DLLMAIN()不接受任何因TreminateThread而结束之线程的DLL_THREAD_DETACH通告消息,如果程序调用exit(1)或ExitProcess结束自己,这种情况会发生
6、MFC的DLL通告消息
一个使用MFC的DLL,拥有它自己的CWINTHRAED对象,可视为CWINAPP对象的一部分,当DLL接收到DLL_PROCESS_ATTACH时,MFC就会调用INITINSTANCE(),会接受到DLL_PROCESS_DETACH时,MFC会调用CWinThread::ExitInstance(),这是两虚函数,可以提供自己的函数,没有任何虚函数在DLL_THREAD_DETACH,DLL_PROCESS_DETACH发生被调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值