// 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; }