一个DLL可以有一个入口点函数。
-系统会在不同的时候调用这个入口点函数,这些调用是通知性的,通常被DLL用来执行一些与进程线程有关的初始化和清理工作。
-如果DLL不需要这些通知,则可以不在源码中实现这个入口点函数。
实现代码:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//第一次将一个DLL映射到进程的地址空间中,之后再Loaibrary不再调用这个入口函数
break;
case DLL_THREAD_ATTACH:
break;
//进程创建一个线程时,DLL执行与线程相关的初始化
case DLL_THREAD_DETACH:
//ExitThread让线程终止
break;
case DLL_PROCESS_DETACH:
//将一个DLL从进程的地址空间中撤销时调用。(即最后一次FreeLibrary或FreeLibraryAndExitThread)
//调用的是FreeLibrary时,在DllMain处理完DLL_PROCESS_DETACH通知之前,线程不会从该调用中返回。
//DLL可能会阻碍进程的终止。
break;
}
return TRUE;
}
DLL的序列化调用