Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
当我的 DLL 被卸载时,我需要销毁一些对象。该对象包含一个有时调用 WSASocket 函数(用于重新连接连接)的线程。因此,我从 DllMain 调用析构函数以响应DLL_PROCESS_DETACH,但这会导致我的应用程序挂起。具体来说,对 WSASocket 的调用被锁定。
DLL_PROCESS_DETACH
我知道有些函数不能从 DllMain 调用,尤其是调用 LoadLibrary 和 FreeLibrary 的函数。但是为什么 WSASocket 函数会出现同样的问题呢?
这是因为您不应该为此使用 DllMain。许多系统过程会导致从 DllMain 调用死锁。声明一个额外的导出过程,特别是用于取消初始化您的 dll 并在 FreeLibrary 之前调用它。
另外,我建议您阅读 MSFT 的“Best Dll Practices”。远离 DllMain 的原因有很多。