更新 : 2007 年 11 月
コンピュータに複数バージョンの Visual C++ がインストールされている場合、または独自のヘルパ関数が定義されている場合は、DLL 遅延読み込みヘルパ関数に加えられた変更の影響を受ける可能性があります。次に例を示します。
__delayLoadHelper は __delayLoadHelper2 に変更されています。
__pfnDliNotifyHook は __pfnDliNotifyHook2 に変更されています。
__pfnDliFailureHook は __pfnDliFailureHook2 に変更されています。
__FUnloadDelayLoadedDLL は __FUnloadDelayLoadedDLL2 に変更されています。
![]() |
---|
既定のヘルパー関数を使用する場合は、変更点に注意する必要はありません。リンカの起動方法に変更はありません。 |
複数バージョンの Visual C++
コンピュータに複数バージョンの Visual C++ がインストールされている場合は、リンカが delayimp.lib と一致しているかどうかを確認してください。一致していない場合は、___delayLoadHelper2@8 または ___delayLoadHelper@8 を未解決の外部シンボルとして報告するリンカ エラーが発生します。前者は新しいリンカと古い delayimp.lib の組み合わせ、後者は古いリンカと新しい delayimp.lib の組み合わせを意味します。
未解決のリンカ エラーが発生した場合は、ヘルパ関数が格納される delayimp.lib で dumpbin /linkermember:1 を実行して、どちらのヘルパ関数が代わりに定義されているのかを確認します。ヘルパー関数は、オブジェクト ファイルで定義されている場合もあります。その場合は、dumpbin /symbols を実行して delayLoadHelper(2) を探します。
Visual C++ 6.0 のリンカを使用していることがわかっている場合は、次の操作を行います。
遅延読み込みヘルパの .lib ファイルまたは .obj ファイルで dumpbin を実行して、__delayLoadHelper2 が定義されているかどうかを確認します。定義されていない場合、リンクは失敗します。
遅延読み込みヘルパの .lib ファイルまたは .obj ファイルで __delayLoadHelper を定義します。
ユーザー定義のヘルパ関数
独自のヘルパ関数を定義していて、現在のバージョンの Visual C++ を使用する場合は、次の操作を行います。
ヘルパ関数の名前を __delayLoadHelper2 に変更します。
遅延記述子 (delayimp.h 内の ImgDelayDescr) のポインタが、32 ビットのプログラムと 64 ビットのプログラムの両方で適切に機能するように、絶対アドレス (VA) から相対アドレス (RVA) に変更されています。このため、それらのアドレスをポインタに変換し直す必要があります。新しい関数として、PFromRva (delayhlp.cpp 内) が導入されています。記述子の各フィールドでこの関数を使用すると、32 ビットのポインタまたは 64 ビットのポインタに変換し直すことができます。既定の遅延読み込みヘルパ関数は、従来と同じようにテンプレートとして利用できます。
遅延読み込みされた DLL に対するすべてのインポートの読み込み
リンカは、遅延読み込みをするように指定した DLL から、すべてのインポートを読み込むことができます。詳細については、「遅延読み込みされた DLL に対するすべてのインポートの読み込み」を参照してください。