私は助けが切望されています。私はVisual Studioでアプリケーションの依存関係を管理する必要があります。アプリケーションはWindowsの特定のバージョンでのみDLLにリンクし、Windows 7と言えば他の環境ではDLLをロードしないでください。 DLL Delay Loadingを使用してどのように達成できるでしょうか?このトピックは私には全く新しいものであり、この特定の問題に関してオンラインで良い参考文献はありません。遅延ロードDLL
よろしく
私は助けが切望されています。私はVisual Studioでアプリケーションの依存関係を管理する必要があります。アプリケーションはWindowsの特定のバージョンでのみDLLにリンクし、Windows 7と言えば他の環境ではDLLをロードしないでください。 DLL Delay Loadingを使用してどのように達成できるでしょうか?このトピックは私には全く新しいものであり、この特定の問題に関してオンラインで良い参考文献はありません。遅延ロードDLL
よろしく
は、あなたのプロジェクトは、それが必要なときにはリンカ/入力/遅延ロードされたDLLのフィールドでそれを指定することにより、ロードする必要がありますに依存しているDLLを指定することができます。この設定は、ビルド構成によって異なる場合があります。
返信する人のThxですが、該当する場合、例またはコードスニペットを与えることができます:) –
これは遅延ロードのポイントです:設定のものであり、コードのものではありません。 – xtofl
言葉が間違っているように見えます:「あなたが依存しているDLLは遅延負荷容量にリンクされているはずです」と言うと、そのDLLの構成要素である.objからそのDLLを作成しているようです。/DELAYフラグは、_imported_モジュールではなく、_importing_を実行するモジュールに実際に適用されます。これはまた、このサポートなしでビルドされたWindows 2000 DLLを遅延ロードできる理由です。 – MSalters
遅延ロードを使用する代わりに、dynamicloadingと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);
MSDNはかなり良い説明を持っていますhere。
基本的に何をやっていると、遅延ロードセクションにあるように、問題のDLLをsettignています。その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を遅延させるオプションを提供します。
アプリケーションは、ヘルパー関数(のVisual C++が提供するデフォルトの実装 )で/DELAYLOAD (Delay Load Import)リンカオプションを使用してDLLのロードを遅らせることができます。ヘルパー関数は、LoadLibraryとGetProcAddressを呼び出すことによって実行時にDLLをロードします( )。
場合は、遅延DLLをロード検討する必要があります。あなたのプログラムがDLL内の関数を呼び出すことはできません
。
DLL内の関数は、後半にあなたのプログラムの 実行中まで呼ばれないことがあります。
DLLの遅れロードは いずれか.EXEまたは.DLLプロジェクトのビルド時に指定することができます。 1つまたは複数のDLLのロード を遅延させる.DLLプロジェクトは、Dllmainに遅延ロードされたエントリポイント を呼び出すべきではありません。
あなたはどのように遅延ローディングの作品を求めている、またはあなたはそれを適用することができますか? – xtofl