2011-12-27 12 views
4

私はそれを試してみましたが、私はそれが仕事を得るcouldntのDllmainはFreeLibraryを使用できますか?

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
if (ul_reason_for_call==DLL_PROCESS_ATTACH) 
if (!CheckSomething()) //check if a file doesnt exists for example 
FreeLibrary(hModule); 

} 

を意味し、いくつかのcondifitonの場合には自己それをアンロードするDLLを作成します。ウォークスルーの代替ソリューションがある場合。 DLLをアンロードするプロセスを欲しくないと思います。

+0

避け、クライアントコードは、DLLが働くことができない本当の理由に関連する方法はありませんエラーを診断することは非常に困難を取得します。クライアントコードが次に使用する可能性のあるエクスポートされた関数であれば、いつでもCheckSomething()を呼び出すことができます。 –

+0

@HansPassantあなたの返事をお寄せいただきありがとうございますが、私の場合はクライアントをコントロールできません。このダーティな方法で行う必要があります。これはまったく良い練習ではありません。いずれにせよ、ロードされたくない場合は、 .. – CnativeFreak

答えて

14

DLLをアンロードできません。まだロードされていません。それが返品の対象となるのはBOOLです。 DLLをロードしない場合は、FALSEを返します。

+0

Lol !,ありがとう、私は私がFalseを返した場合、LoadLibrary Will freeItを知っていませんでした。私は11分後にあなたの答えを受け入れるだろう(私は今)傾きをもう一度ありがとう:) – CnativeFreak

0

dll main関数でFreeLibraryを呼び出すと、クラッシュメッセージが表示されます。 FreeLibrary関数の呼び出しが成功したためです。しかし、FreeLibraryのリターンアドレスは解放されたメモリです。 したがって、プロセスによってクラッシュが発生します(アクセス違反)。

あなたは「Dllファイル自己アンロード」のソースコードを見たい場合はこれをやってDll Self Unloading

+1

Dllの自己アンロード(外部DllMain)のためにFreeLibraryAndExitThreadを使用してください。 http://stackoverflow.com/a/20280145/193017をご覧ください。 –

関連する問題