DLL应用程序的入口点是DllMain
对程序员来说,DLL应用程序的入口点是DllMain。
DllMain负责初始化(Initialization)和结束(Termination)工作,每当一个新的进程或者该进程的新的线程访问DLL时,或者访问DLL的每一个进程或者线程不再使用DLL或者结束时,都会调用DllMain。但是,使用TerminateProcess或TerminateThread结束进程或者线程,不会调用DllMain。
DllMain的函数原型符合DllEntryPoint的要求,有如下结构:
BOOL WINAPI DllMain (HANDLE hInst,
ULONG ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
...
}
return TRUE;
}
其中:
参数1包含了DLL的实例句柄,这个值用于标识DLL的文件映像被映射到进程的地址空间中的虚拟内存地址
参数2是指调用DllMain的类别,四种取值:新的进程要访问DLL;新的线程要访问DLL;一个进程不再使用DLL(Detach fromDLL);一个线程不再使用DLL(Detach fromDLL)。
参数3保留。
如果程序员不指定DllMain,则编译器使用它自己的DllMain,该函数仅仅返回TRUE。
规则DLL应用程序使用了MFC的DllMain,它将调用DLL程序的应用程序对象(从CWinApp派生)的InitInstance函数和ExitInstance函数。
扩展DLL必须实现自己的DllMain。
必须记住:DLL使用DllMain函数来对他们进行初始化,当你的DllMain函数执行时,同一个地址空间中的其他DL可能尚未执行他们的DllMain函数,这就意味着他们尚未初始化,因此你应该避免调用从其他DLL中输入的函数。
联系客服