2009-09-07 31 views
6

私は助けが切望されています。私はVisual Studioでアプリケーションの依存関係を管理する必要があります。アプリケーションはWindowsの特定のバージョンでのみDLLにリンクし、Windows 7と言えば他の環境ではDLLをロードしないでください。 DLL Delay Loadingを使用してどのように達成できるでしょうか?このトピックは私には全く新しいものであり、この特定の問題に関してオンラインで良い参考文献はありません。遅延ロードDLL

よろしく

+1

あなたはどのように遅延ローディングの作品を求めている、またはあなたはそれを適用することができますか? – xtofl

答えて

8

は、あなたのプロジェクトは、それが必要なときにはリンカ/入力/遅延ロードされたDLLのフィールドでそれを指定することにより、ロードする必要がありますに依存しているDLLを指定することができます。この設定は、ビルド構成によって異なる場合があります。

+0

返信する人のThxですが、該当する場合、例またはコードスニペットを与えることができます:) –

+4

これは遅延ロードのポイントです:設定のものであり、コードのものではありません。 – xtofl

+0

言葉が間違っているように見えます:「あなたが依存しているDLLは遅延負荷容量にリンクされているはずです」と言うと、そのDLLの構成要素である.objからそのDLLを作成しているようです。/DELAYフラグは、_imported_モジュールではなく、_importing_を実行するモジュールに実際に適用されます。これはまた、このサポートなしでビルドされたWindows 2000 DLLを遅延ロードできる理由です。 – MSalters

1

遅延ロードを使用する代わりに、dynamicloadingLoadLibraryGetProcAddressを使用すると考えましたか?これは、使用する方が簡単です。

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); 
+9

リンカーによって自動的に生成されるコードを作成する方が簡単ですか? – xtofl

+2

あなたが呼びたい1つの機能しか持っていなければ、その罰金...そうでなければその普通の悪い選択、imo。 – Goz

+3

-1 - リンカでの遅延ロードのサポートは、特にLoadLibrary()とGetProcAddress()を処理する必要がないようにすることを目的としています。 – Bids

10

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に遅延ロードされたエントリポイント を呼び出すべきではありません。