質問

私は動的に複数回の別々のDLLを呼び出す必要DLLを書いています。私は、ロードされた呼び出し先を維持し、私のDLLがアンロードされるときにちょうどそれをアンロードしたいと思います。しかし、Microsoftによると、それはhref="http://support.microsoft.com/kb/815065" rel="nofollow noreferrer">悪い考えの

  

エントリポイント関数はすべき   簡単な初期化タスクを実行します   そして、他のDLLを呼び出すべきではありません   ロードまたは終了機能。ために   例えば、エントリポイント関数で、   あなたは、直接または間接的にいけません   LoadLibrary関数を呼び出しますか、   LoadLibraryEx機能。さらに、   あなたはにFreeLibraryを呼び出すべきではありません   プロセスが機能   終端ます。

ここで問題のあるコードです。誰かが私は私のDLLのエントリポイントからのLoadLibraryとFreeLibraryのを呼ぶべきではない理由を説明することはできますか?

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
switch (ul_reason_for_call) {
    case DLL_PROCESS_DETACH :
            if (hLogLib != NULL) FreeLibrary(hLogLib);
            break;
    }
    return TRUE;
}

他のヒント

あなたはDllMain関数は、OSローダーロックと(LoadLibraryのを呼び出すことによって、例えば)がローダーロックを再取得しようとする試み内で実行されますので、あなたのエントリポイントからのLoadLibraryを呼び出すことはできませんデッドロックになります。

のDLLMainの内部結果ののの何もしないでください。真剣に。あなたの自由がゼロに参照カウントをデクリメントし、ライブラリが実際に解放されることが起こる場合にFreeLibraryを呼び出すと、理由はそれだけよ。の、時にはのデッドロックさらに悪くなる。

scroll top