次の方法で共有


遅延読み込みした DLL のアンロード

既定の遅延読み込みヘルパー関数では、遅延読み込み記述子が、pUnloadIAT フィールドに元のインポート アドレス テーブル (IAT: Import Address Table) のポインターとコピーを持つかどうかを調べます。 これらを持つ場合は、ポインターをインポート遅延記述子に対するリストに保存します。 これにより、ヘルパー関数は名前で DLL を検索し、明示的にアンロードできます。

遅延読み込みした DLL の明示的アンロードには、以下の構造体と関数を使用します。

//
// Unload support from delayimp.h
//

// routine definition; takes a pointer to a name to unload

ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);

// structure definitions for the list of unload records
typedef struct UnloadInfo * PUnloadInfo;
typedef struct UnloadInfo {
    PUnloadInfo     puiNext;
    PCImgDelayDescr pidd;
    } UnloadInfo;

// from delayhlp.cpp
// the default delay load helper places the unloadinfo records in the 
// list headed by the following pointer.
ExternC
PUnloadInfo __puiHead;

UnloadInfo 構造体は、演算子 newdelete の代わりに LocalAllocLocalFree を使用する C++ クラスで実装します。 これらのオプションは、__puiHead を使用して標準リンク リストの先頭に保存されます。

__FUnloadDelayLoadedDLL を呼び出すと、指定した名前が読み込み済みの DLL のリスト内で検索されます (完全に一致する名前だけが検索されます)。 指定した名前が見つかると、pUnloadIAT の IAT のコピーが実行中の IAT の先頭にコピーされ、サンク ポインターが復元されます。ライブラリは FreeLibrary によって解放され、一致する UnloadInfo レコードがリストからリンク解除され、削除された後、TRUE が返されます。

__FUnloadDelayLoadedDLL2 関数の引数では、大文字と小文字が区別されます。 たとえば、次のように指定します。

__FUnloadDelayLoadedDLL2("user32.DLL");

次のようには指定しないでください。

__FUnloadDelayLoadedDLL2("User32.DLL");.

参照

参照

ヘルパー関数について