0

DLL をアンロードするときに、いくつかのオブジェクトを破棄する必要があります。このオブジェクトには、(接続を再接続するために) WSASocket 関数を呼び出すことがあるスレッドが含まれています。そのため、 に応答して DllMain からデストラクタを呼び出しますDLL_PROCESS_DETACHが、アプリケーションがハングします。具体的には、WSASocket の呼び出しがロックされます。

一部の関数、特に LoadLibrary と FreeLibrary を呼び出す関数は DllMain から呼び出せないことを知っています。しかし、なぜ WSASocket 関数にも同じ問題があるのでしょうか?

4

1 に答える 1

0

その理由は、DllMain を使用してはならないからです。多くのシステム プロシージャは、DllMain から呼び出されるデッドロックを引き起こします。特に dll の初期化を解除するための追加のエクスポート プロシージャを宣言し、FreeLibrary の直前にそれを呼び出します。

また、MSFT の "Best Dll Practices" を読むことをお勧めします。DllMain を使用しない理由はたくさんあります。

于 2013-10-21T10:02:22.030 に答える