| 123456789101112131415161718192021222324 |
- // dllmain.cpp - DLL 入口
- // 重要:DllMain 在 Loader Lock 内部调用,严禁执行以下操作:
- // - LoadLibrary / LoadLibraryEx(递归加载导致死锁)
- // - 复杂 STL 操作(std::thread、std::mutex 动态初始化等)
- // - 任何可能触发其他 DLL 加载的调用
- // 因此 DllMain 仅做最必要的 DisableThreadLibraryCalls,
- // 所有初始化(Logger、MonitorManager 等)延迟到首次导出函数调用时执行。
- #include "pch.h"
- extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved) {
- switch (reason) {
- case DLL_PROCESS_ATTACH:
- // 禁用线程通知,避免每次线程创建/退出都进入 DllMain
- DisableThreadLibraryCalls(hInstance);
- break;
- case DLL_PROCESS_DETACH:
- // 注意:PROCESS_DETACH 时也在 Loader Lock 内,
- // 不在此处调用 FreeAll(否则首次构造 MonitorManager 会死锁)。
- // FreeAll 由上层在 FreeMonitor() 中显式调用,或进程退出时 OS 回收资源。
- break;
- }
- return TRUE;
- }
|