DLL の遅延読み込みの制約
インポートの遅延読み込みには以下の制約があります。
データのインポートはサポートできません。LoadLibrary と GetProcAddress を使用して、データ インポートを明示的に処理する必要があります。遅延読み込みヘルパーによって DLL が読み込まれている場合は、LoadLibrary の代わりに、GetModuleHandle を使用します。
Kernel32.dll の遅延読み込みはサポートされていません。この DLL は、遅延読み込みヘルパー ルーチンが遅延読み込みを実行するために必要です。
前方に移動されたエントリ ポイントのバインドはサポートされていません。
遅延読み込みした DLL のエントリ ポイントでプロセス単位の初期化を行う場合は、DLL の遅延読み込みによってプロセスの動作が異なることがあります。また、DLL を LoadLibrary で読み込むと、__declspec(thread) で宣言した静的なスレッド ローカル ストレージ (TLS: Thread Local Storage) が処理されません。ただし、TlsAlloc、TlsFree、TlsGetValue、および TlsSetValue を使用する動的 TLS は、静的な DLL でも遅延読み込み DLL でも使用できます。
静的 (グローバル) な関数ポインターは、インポートした関数の初回呼び出し後に、この関数を指すように初期化し直す必要があります。これは、関数ポインターが初回使用時にサンクを指すためです。
現在は、通常のインポート機構を使用しながら、DLL の特定のプロシージャだけで遅延読み込みを実行する手段はありません。
x86 アーキテクチャで条件コードを使用するなどのカスタム呼び出し規約は、サポートされていません。また、RISC コンピューターでは、ヘルパー ルーチンまたはフックで浮動小数点日付型を使用できません。浮動小数点レジスタは、どのプラットフォームでも保存されません。カスタム ヘルパー ルーチンまたはフック ルーチンで浮動小数点型が使用される場合は、浮動小数点パラメーターを使ったレジスタ呼び出し規約を持つコンピューターで、浮動小数点状態の保存および復元を行う必要があります。ヘルパー関数の数値データ プロセッサ (NDP: Numeric Data Processor) スタックの浮動小数点パラメーターを使用する CRT 関数を呼び出す場合は、CRT DLL の遅延読み込みに注意が必要です。