遅延読み込みした DLL の明示的なアンロード
/delay:unload リンカー オプションによって、遅延読み込みした DLL をアンロードできます。既定では、/delay:unload と __FUnloadDelayLoadedDLL2 をコードに使用して DLL がアンロードされると、遅延読み込みされたインポートがインポート アドレス テーブル (IAT: Import Address Table) に残ります。しかし、リンカーのコマンド ラインで /delay:unload を指定した場合は、ヘルパー関数によって DLL の明示的アンロードがサポートされます。IAT は元の内容にリセットされ、無効になったポインターが上書きされます。IAT は、元の IAT のコピーがある場合に、そのアドレスが格納される ImgDelayDescr のフィールドです。
例
コード
// link with /link /DELAYLOAD:MyDLL.dll /DELAY:UNLOAD
#include <windows.h>
#include <delayimp.h>
#include "MyDll.h"
#include <stdio.h>
#pragma comment(lib, "delayimp")
#pragma comment(lib, "MyDll")
int main()
{
BOOL TestReturn;
// MyDLL.DLL will load at this point
fnMyDll();
//MyDLL.dll will unload at this point
TestReturn = __FUnloadDelayLoadedDLL2("MyDll.dll");
if (TestReturn)
printf_s("\nDLL was unloaded");
else
printf_s("\nDLL was not unloaded");
}
コメント
遅延読み込みされた DLL のアンロードに関する重要事項
__FUnloadDelayLoadedDLL2 関数の実装は、\VC7\INCLUDE\DELAYHLP.CPP ファイルにあります。
__FUnloadDelayLoadedDLL2 関数の名前パラメーターは、大文字と小文字の区別も含めて、インポート ライブラリの内容と完全に一致している必要があります。文字列もイメージのインポート テーブルの内容と同じになります。インポート ライブラリの内容は、DUMPBIN /DEPENDENTS で表示できます。文字列の大文字と小文字を区別しない場合は、CRT 文字列関数のいずれかを使用するように、または Windows API 呼び出しを使用するように、__FUnloadDelayLoadedDLL2 を更新します。
詳細については、「遅延読み込みした DLL のアンロード」を参照してください。