1

私のWindowsC++プログラムでは、DLLにいくつかの依存関係があります(入力デバイスのドライバーが付属しています)。私は実際にDLLを自分でロードしませんが、ドライバーは静的にリンクする(小さな).libライブラリを提供します(そして、DLLがシステムに存在することを確認し、それらをロードするのはそれらのライブラリであると思います)。一連のビデオカメラから入力を受け取ることができるアプリケーションを書いています。実行時に、ユーザーはどちらを使用するかを選択します。現在の私の問題は、カメラが接続されているかどうかを照会するルーチンが、システムに存在するカメラの機能をすでに必要としていることです。つまり、カメラモデルAとBがあるとしましょう。ユーザーは、モデルBを所有していることを知っていても、AとBのドライバーをインストールする必要があります。そうしないと、ユーザーはこれを行う必要があります。

実行時に、どのDLLが存在するかを判断する可能性があるかどうかを知りたいのですが、存在しない場合は、静的(したがって動的)コンポーネントでさえロードを無効にします。

だから基本的に私の問題はあなたができないということですif(DLL was found){ #include "source that includes header using functions defined in lib which loads DLL"}

4

2 に答える 2

2

DELAYLOADリンカーフラグを使用すると、必要な機能が提供される可能性があると思います。ファイルとのリンクを許可し.libますが、使用されている場合にのみDLLのロードを試みます。

link.exe ... /DELAYLOAD:cameraA.dll /DELAYLOAD:cameraB.dll Delayimp.lib

コードは次のような構造になります。

if (/* user selected A */)
{
    // Use camera A functions, resulting in load of cameraA's DLL.
}
else
{
    // Use camera B functions, resulting in load of cameraB's DLL.
}

遅延ロードされたDLLのリンカーサポート から:

Visual C ++ 6.0以降、DLLと静的にリンクする場合、
リンカは、プログラムが呼び出すまでDLLのロードを遅らせるオプションを提供します
そのDLLの関数。

アプリケーションは、/ DELAYLOAD(Delay Load Import)を使用してDLLのロードを遅延させることができます
ヘルパー関数を使用したリンカーオプション(デフォルトの実装はによって提供されます)
Visual C ++)。ヘルパー関数は、実行時に次を呼び出すことによってDLLをロードします
LoadLibraryとGetProcAddressを使用してください。

次の場合は、DLLのロードを遅らせることを検討する必要があります。

-プログラムがDLL内の関数を呼び出さない場合があります。
-DLL内の関数は、プログラムの後半まで呼び出されない場合があります
 実行。
于 2012-05-10T07:23:59.787 に答える
0

実行時にライブラリをロードする必要があります。を見てくださいLoadLibary

これはこれに関するMSDNの記事です:DLLsダイナミックウェイ私はこれを一瞥しました。とても古いです。

これは、LoadLibraryの使用法を示しています:ランタイムダイナミックリンクの使用

于 2012-05-10T07:19:18.997 に答える