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发生被调用