次の方法で共有


DLL の遅延読み込みの制約

更新 : 2007 年 11 月

インポートの遅延読み込みには以下の制約があります。

  • データのインポートはサポートできません。LoadLibraryGetProcAddress を使用して、データ インポートを明示的に処理する必要があります。遅延読み込みヘルパによって DLL が読み込まれている場合は、LoadLibrary の代わりに、GetModuleHandle を使用します。

  • Kernel32.dll の遅延読み込みはサポートされていません。この DLL は、遅延読み込みヘルパ ルーチンが遅延読み込みを実行するために必要です。

  • 前方に移動されたエントリ ポイントのバインドはサポートされていません。

  • 遅延読み込みした DLL のエントリ ポイントでプロセス単位の初期化を行う場合は、DLL の遅延読み込みによってプロセスの動作が異なることがあります。また、DLL を LoadLibrary で読み込むと、__declspec(thread) で宣言した静的なスレッド ローカル ストレージ (TLS: Thread Local Storage) が処理されません。ただし、TlsAllocTlsFreeTlsGetValue、および TlsSetValue を使用する動的 TLS は、静的な DLL でも遅延読み込み DLL でも使用できます。

  • 静的 (グローバル) な関数ポインタは、インポートした関数の初回呼び出し後に、この関数を指すように初期化し直す必要があります。これは、関数ポインタが初回使用時にサンクを指すためです。

  • 現在は、通常のインポート機構を使用しながら、DLL の特定のプロシージャだけで遅延読み込みを実行する手段はありません。

  • x86 アーキテクチャで条件コードを使用するなどのカスタム呼び出し規約は、サポートされていません。また、RISC コンピュータでは、ヘルパ ルーチンまたはフックで浮動小数点日付型を使用できません。浮動小数点レジスタは、どのプラットフォームでも保存されません。カスタム ヘルパ ルーチンまたはフック ルーチンで浮動小数点型が使用される場合は、浮動小数点パラメータを使ったレジスタ呼び出し規約を持つコンピュータで、浮動小数点状態の保存および復元を行う必要があります。ヘルパ関数の数値データ プロセッサ (NDP: Numeric Data Processor) スタックの浮動小数点パラメータを使用する CRT 関数を呼び出す場合は、CRT DLL の遅延読み込みに注意が必要です。

参照

概念

リンカによる DLL の遅延読み込み