DLL 入口函数
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: // 第一次将一个DLL映射到进程地址空间时调用 // The DLL is being mapped into the process' address space. break; case DLL_THREAD_ATTACH: // 当进程创建一个线程的时候,用于告诉DLL执行与线程相关的初始化(非主线程执行) // A thread is bing created. break; case DLL_THREAD_DETACH: // 系统调用 ExitThread 线程退出前,即将终止的线程通过告诉DLL执行与线程相关的清理 // A thread is exiting cleanly. break; case DLL_PROCESS_DETACH: // 将一个DLL从进程的地址空间时调用 // The DLL is being unmapped from the process' address space. break; } return (TRUE); // Used only for DLL_PROCESS_ATTACH }
在 Windows 中,DllMain 是一个可选的函数,它是 DLL 的入口点。当 DLL 被加载到进程地址空间或从进程中卸载时,DllMain 函数会被操作系统调用。DllMain 通常用于执行以下任务:
-
初始化:当 DLL 首次加载到进程时,DllMain 可以用来执行初始化操作,如分配资源、初始化数据结构或设置钩子。
-
清理:当 DLL 从进程中卸载时,DllMain 可以用来执行清理操作,如释放资源、关闭文件句柄或撤销之前设置的钩子。
-
进程附加和分离通知:DllMain 可以用来跟踪有多少个进程附加到了该 DLL,这对于实现某些需要跨进程共享状态的 DLL 功能是有用的。
-
管理进程间的通信:DllMain 可以用来处理进程间的通信,例如,当一个新的进程附加到 DLL 时,DLL 可以启动一个线程来与新进程通信。
-
调试和诊断:在调试 DLL 时,DllMain 可以用来记录加载和卸载事件,帮助诊断问题。
需要注意的是,并不是所有的 DLL 都需要 DllMain 函数。只有在需要处理 DLL 级别的事件(如加载和卸载)或需要跨多个模块共享状态时,才需要实现 DllMain。如果 DLL 只是提供函数和资源供其他模块调用,而不需要特别的初始化或清理,那么可以不包含 DllMain 函数。