10

Visual Studio でアプリケーションの依存関係を管理する必要があります。アプリケーションは、Windows 7 などの特定のバージョンの Windows でのみ DLL にリンクします。その他の環境では、DLL をロードしないでください。このトピックは私にとってまったく新しいものであり、この特定の問題に関する適切な参照がオンラインにないため、DLL Delay Loading を使用してそれを達成するにはどうすればよいでしょうか。

よろしく

4

3 に答える 3

11

プロジェクトは、Linker/Input/Delay Loaded DLLs フィールドで指定することにより、依存する dll を必要に応じてロードするように指定できます。この設定は、ビルド構成ごとに異なる場合があります。

于 2009-09-07T09:26:13.120 に答える
11

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 で遅延読み込みエントリ ポイントを呼び出すことはできません。

于 2009-09-07T09:31:07.013 に答える
2

遅延読み込みを使用する代わりに、および で動的 読み込みを使用することを検討しましたか? これはおそらく使いやすいです。LoadLibraryGetProcAddress

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);
于 2009-09-07T09:27:57.683 に答える