3

.LIB および .DLL ファイルを含むサードパーティ コンポーネントがあります。コンポーネントを使用するために、.LIB を C++ プログラムにリンクし、.DLL をアプリケーションと共に配布します。提供される機能は非常に具体的で、私のユーザーの小さなサブセットにのみ関連していますが、.DLL を配布するにはライセンス料が発生します。

ここでの回避策の 1 つは、アプリの 2 つのバージョンを作成することです。1 つはサード パーティ コンポーネントにリンクし、もう 1 つはリンクしていませんが、2 番目のビルドの維持と配布にかかる余分な時間を避けたいと考えています。

理想的には、配布から .DLL を単純に除外したいのですが、これを行うと、「XXXXX.DLL が見つからなかったため、このアプリケーションは開始できませんでした」というエラーが表示されます。アプリケーションを再インストールすると、この問題が解決する場合があります。これは、コードでキャッチして処理できる例外ですか? または、提供されている特定の機能を呼び出して処理するまで .DLL の読み込みを遅らせることはできますか?

環境はVS2003とVS2008です。

4

4 に答える 4

6

dllにリンクした後、バインディングを停止する方法はありません。youoが持っている唯一の方法は、実行時にdllを動的にロードする場合です。

DLLの解決は、exeの実行が開始される前に実行されます。コードはどういうわけかそのように見えるかもしれません。これがサードパーティのdllで機能しない場合は、サードパーティのdllをラップし、実行時に動的にロードできる独自のdllを作成できます。

HINSTANCE lib = LoadLibraryEx("C:\dlls\thirdparty.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if(0 != lib) {
    // Dll is present so use it
    typedef  CObj ( __cdecl *tFunction ) (const wchar_t*, const int&);
    tFunction functionEntry = (tFunction)(GetProcAddress( lib,"EntryFunction"));

    assert(0 != functionEntry);
    // call the function
    CObj obj = functionEntry(L"Hello", 1);
}
else {
    // dll not present
}

更新:dllへのフルパスを使用して、この名前のdllがプルされないようにしてください。

于 2010-03-03T08:12:54.297 に答える
5

Visual Studioは、遅延ロードされたDLLをサポートしています。この機能を使用すると、そのライブラリから関数を初めて呼び出すときにDLLがロードされます。ただし、コンポーネントのライセンスをチェックして、それが許可されているかどうかを確認する必要があります。

于 2010-03-03T08:04:06.953 に答える
3

LoadLibrary() API関数を使用してDLLを動的にロードできますが、その場合、アプリケーションが呼び出す必要のあるDLLによってエクスポートされたすべての関数でGetProcAddress()を使用する必要があります。

于 2010-03-03T08:03:08.707 に答える
3

関数を使用LoadLibraryしてDLLを明示的にロードし、結果を確認できます。成功した場合は、を使用して関数GetProcAddressを見つけますCreateMyInterfaceImpl。それ以外の場合は、インターフェイスの偽の実装を使用するか、まったく使用しないでください。

于 2010-03-03T08:03:19.060 に答える