Мне нужно уничтожить некоторые объекты, когда моя DLL выгружена. Этот объект содержит поток, который иногда вызывает функцию WSASocket (для переподключения соединения). Итак, я вызываю деструктор из DllMain в ответ на DLL_PROCESS_DETACH
, но это приводит к зависанию моего приложения. В частности, вызов WSASocket блокируется.
Я знаю, что некоторые функции нельзя вызывать из DllMain, особенно функции, которые вызывают LoadLibrary и FreeLibrary. Но почему у функции WSASocket такая же проблема?
Это потому, что вы не должны использовать DllMain для этой цели. Многие системные процедуры вызывают тупик, вызываемый из DllMain. Объявите дополнительный экспортный процесс специально для деинициализации вашей dll и вызовите его прямо перед FreeLibrary.
Также я рекомендую вам прочитать «Best Dll Practices» от MSFT. Есть много причин, чтобы держаться подальше от DllMain.
Других решений пока нет …