なぜエントリポイント関数からFreeLibraryを呼び出すことはできませ?
-
19-09-2019 - |
質問
私は動的に複数回の別々の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;
}
解決
エントリポイント関数べき 単純な初期化を実行したり、 終了タスク。これは、呼び出してはいけません LoadLibraryのかLoadLibraryEx 機能(または呼び出す関数 これらの機能)、これは可能性があるため、 DLLに依存ループを作成 ロード順。これは、DLLにつながることができます システムが持って前に使用されています その初期化コードを実行します。 同様に、エントリポイント関数 FreeLibrary関数を呼び出す必要がありません (またはにFreeLibraryを呼び出す関数) プロセスの終了時に、理由 これは、使用しているDLLにつながることができます システムが実行された後にその 終了コードます。
他のヒント
あなたはDllMain関数は、OSローダーロックと(LoadLibraryのを呼び出すことによって、例えば)がローダーロックを再取得しようとする試み内で実行されますので、あなたのエントリポイントからのLoadLibraryを呼び出すことはできませんデッドロックになります。
のDLLMainの内部結果ののの何もしないでください。真剣に。あなたの自由がゼロに参照カウントをデクリメントし、ライブラリが実際に解放されることが起こる場合にFreeLibraryを呼び出すと、理由はそれだけよ。の、時にはのデッドロックさらに悪くなる。