Visual Studio でアプリケーションの依存関係を管理する必要があります。アプリケーションは、Windows 7 などの特定のバージョンの Windows でのみ DLL にリンクします。その他の環境では、DLL をロードしないでください。このトピックは私にとってまったく新しいものであり、この特定の問題に関する適切な参照がオンラインにないため、DLL Delay Loading を使用してそれを達成するにはどうすればよいでしょうか。
よろしく
Visual Studio でアプリケーションの依存関係を管理する必要があります。アプリケーションは、Windows 7 などの特定のバージョンの Windows でのみ DLL にリンクします。その他の環境では、DLL をロードしないでください。このトピックは私にとってまったく新しいものであり、この特定の問題に関する適切な参照がオンラインにないため、DLL Delay Loading を使用してそれを達成するにはどうすればよいでしょうか。
よろしく
プロジェクトは、Linker/Input/Delay Loaded DLLs フィールドで指定することにより、依存する dll を必要に応じてロードするように指定できます。この設定は、ビルド構成ごとに異なる場合があります。
MSDN にはかなり適切な説明があります ここ。
基本的に、問題の DLL を遅延ロード セクションに設定します。その DLL 内にある関数を呼び出すまで、その DLL は読み込まれません。
上記のリンクから:
Visual C++ リンカーは、DLL の遅延ロードをサポートするようになりました。これにより、Windows SDK 関数 LoadLibrary および GetProcAddress を使用して DLL 遅延読み込みを実装する必要がなくなります。
Visual C++ 6.0 より前は、実行時に DLL をロードする唯一の方法は、LoadLibrary と GetProcAddress を使用することでした。オペレーティング システムは、DLL を使用する実行可能ファイルまたは DLL が読み込まれると、DLL を読み込みます。
Visual C++ 6.0 以降、DLL と静的にリンクする場合、プログラムがその DLL 内の関数を呼び出すまで DLL の読み込みを遅延させるオプションがリンカーに用意されています。
アプリケーションは、/DELAYLOAD (Delay Load Import)リンカー オプションとヘルパー関数 (Visual C++ によって提供される既定の実装) を使用して、DLL の読み込みを遅らせることができます。ヘルパー関数は、LoadLibrary と GetProcAddress を呼び出すことによって、実行時に DLL をロードします。
次の場合は、DLL のロードを遅らせることを検討する必要があります。
プログラムが DLL 内の関数を呼び出さない場合があります。
DLL 内の関数は、プログラムの実行の後半まで呼び出されない場合があります。
DLL の遅延読み込みは、.EXE または .DLL プロジェクトのビルド中に指定できます。1 つまたは複数の DLL の読み込みを遅らせる .DLL プロジェクト自体が、Dllmain で遅延読み込みエントリ ポイントを呼び出すことはできません。
遅延読み込みを使用する代わりに、および で動的 読み込みを使用することを検討しましたか? これはおそらく使いやすいです。LoadLibrary
GetProcAddress
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
PGNSI pGNSI;
SYSTEM_INFO si;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else GetSystemInfo(&si);