既定の遅延読み込みヘルパー関数では、遅延読み込み記述子が、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 構造体は、演算子 new と delete の代わりに LocalAlloc と LocalFree を使用する C++ クラスで実装します。 これらのオプションは、__puiHead を使用して標準リンク リストの先頭に保存されます。
__FUnloadDelayLoadedDLL を呼び出すと、指定した名前が読み込み済みの DLL のリスト内で検索されます (完全に一致する名前だけが検索されます)。 指定した名前が見つかると、pUnloadIAT の IAT のコピーが実行中の IAT の先頭にコピーされ、サンク ポインターが復元されます。ライブラリは FreeLibrary によって解放され、一致する UnloadInfo レコードがリストからリンク解除され、削除された後、TRUE が返されます。
__FUnloadDelayLoadedDLL2 関数の引数では、大文字と小文字が区別されます。 たとえば、次のように指定します。
__FUnloadDelayLoadedDLL2("user32.DLL");
次のようには指定しないでください。
__FUnloadDelayLoadedDLL2("User32.DLL");.