次の方法で共有


遅延読み込みした DLL の明示的なアンロード

/delay:unload リンカー オプションによって、遅延読み込みした DLL をアンロードできます。既定では、/delay:unload と __FUnloadDelayLoadedDLL2 をコードに使用して DLL がアンロードされると、遅延読み込みされたインポートがインポート アドレス テーブル (IAT: Import Address Table) に残ります。しかし、リンカーのコマンド ラインで /delay:unload を指定した場合は、ヘルパー関数によって DLL の明示的アンロードがサポートされます。IAT は元の内容にリセットされ、無効になったポインターが上書きされます。IAT は、元の IAT のコピーがある場合に、そのアドレスが格納される ImgDelayDescr のフィールドです。

96c1b5cf.collapse_all(ja-jp,VS.110).gifコード

// 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");
}

96c1b5cf.collapse_all(ja-jp,VS.110).gifコメント

遅延読み込みされた DLL のアンロードに関する重要事項

  • __FUnloadDelayLoadedDLL2 関数の実装は、\VC7\INCLUDE\DELAYHLP.CPP ファイルにあります。

  • __FUnloadDelayLoadedDLL2 関数の名前パラメーターは、大文字と小文字の区別も含めて、インポート ライブラリの内容と完全に一致している必要があります。文字列もイメージのインポート テーブルの内容と同じになります。インポート ライブラリの内容は、DUMPBIN /DEPENDENTS で表示できます。文字列の大文字と小文字を区別しない場合は、CRT 文字列関数のいずれかを使用するように、または Windows API 呼び出しを使用するように、__FUnloadDelayLoadedDLL2 を更新します。

詳細については、「遅延読み込みした DLL のアンロード」を参照してください。

参照

概念

リンカーによる DLL の遅延読み込み