次の方法で共有


Visual C++ 6.0 以降の DLL 遅延読み込みヘルパー関数の変更点

コンピューターに複数バージョンの 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 に対するすべてのインポートの読み込み」を参照してください。

参照

関連項目

ヘルパー関数について