次の方法で共有


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 に対するすべてのインポートの読み込み」を参照してください。

参照

参照

ヘルパー関数について