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