Почему вызов WSASocket из DllMain приводит к зависанию?

Мне нужно уничтожить некоторые объекты, когда моя DLL выгружена. Этот объект содержит поток, который иногда вызывает функцию WSASocket (для переподключения соединения). Итак, я вызываю деструктор из DllMain в ответ на DLL_PROCESS_DETACH, но это приводит к зависанию моего приложения. В частности, вызов WSASocket блокируется.

Я знаю, что некоторые функции нельзя вызывать из DllMain, особенно функции, которые вызывают LoadLibrary и FreeLibrary. Но почему у функции WSASocket такая же проблема?

0

Решение

Это потому, что вы не должны использовать DllMain для этой цели. Многие системные процедуры вызывают тупик, вызываемый из DllMain. Объявите дополнительный экспортный процесс специально для деинициализации вашей dll и вызовите его прямо перед FreeLibrary.

Также я рекомендую вам прочитать «Best Dll Practices» от MSFT. Есть много причин, чтобы держаться подальше от DllMain.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]