1

サードパーティの Windows アプリケーション用の C++ プラグイン DLL を作成しています。プラグイン DLL はファイル システムのどこにでも置くことができ、サードパーティ アプリからロードするときにその場所を指定します。

DLL の機能の一部では、サードパーティ ライブラリ ( ZeroMQ ) を使用する必要があります。DLL を ZeroMQ ライブラリにリンクすると、正しくビルドされました。ただし、サードパーティのアプリに DLL をロードすると、The specified module could not be found.エラーが発生し続けました。最初は、zeromq DLL が必要かどうかにかかわらず、ZeroMQ 静的ライブラリを使用したかどうかは明確ではありませんでした (しかし、明らかに、DLL へのアクセスをラップする静的ライブラリを使用するのが一般的です: Visual Studio 2010 C++ で .dll を使用する))。

ゼロ mq dll (私の場合は libzmq-v100-mt-gd-3_2_2.dll) をプラグイン DLL と同じフォルダーに入れてみましたが、うまくいきませんでした。

最後に、完全な実験により、zeromq dll をメインのサードパーティ アプリケーションと同じフォルダーに直接配置できることがわかり、プラグインが機能するようになりました。ただし、理想的には、そうしない方がよいでしょう。zeromq dll ライブラリをプラグイン DLL と同じフォルダに配置する方法はありますか? もしそうなら、どのように?DLL をビルドするときの Visual Studio の設定オプションでしょうか。

4

3 に答える 3

2

あなたがしたいのは、次のようなものを使用して、後で DLL の読み込みを遅らせることです。

http://msdn.microsoft.com/en-us/library/151kt790.aspx

DLL の読み込みを遅らせる

http://www.codeproject.com/Articles/9428/Delay-Loading-a-DLL

.lib が実行時に DLL をロードしないようにする

次に、読み込みが発生する前に、DLL のパス全体を入力できる LoadLibrary を使用して DLL を動的に読み込みます。

遅延読み込みが発生すると、LoadLibrary 呼び出しによって DLL が既に読み込まれていることがわかります。

または、LoadLibrary でロードする代わりに、以下を使用してディレクトリを dll 検索パスに追加することもできます。

http://msdn.microsoft.com/en-us/library/ms686203.aspx

遅延読み込みが発生すると、そのディレクトリで dll と viola が検索されます...

于 2013-02-09T07:26:40.927 に答える
2

問題は、Windows が dll を検索するときに使用する検索パスにアプリケーションのパスが含まれていても、プラグイン dll のパスが含まれていないことです (アプリケーションのサプライヤーにこの機能を追加するよう説得できない限り!)。プラグイン dll をロードするとき、ローダーは libzmq-v100-mt-gd-3_2_2.dll からエクスポートされた関数が必要であることを認識し、それを見つけようとしました。あなたが見つけたものは予想通りです - アプリケーションディレクトリは dll 検索パスにあるので、そこに libzmq-v100-mt-gd-3_2_2.dll を配置すると、ローダーはそれを正しく見つけ、プラグイン dll の読み込みを続けます。プラグインのパスを検索パスに追加する方法はいくつかありますが、残念ながらこれらは dll で使用できません。dll が正しくロードされている場合にのみコードが実行されるためです。libzmq-v100- mt-gd-3_2_2.dll が見つかりません!

提案されているように、ロードを遅らせると、問題が解決する可能性があります。私が見ることができる他のオプションは次のとおりです。

  • プラグイン インストーラーでプラグインのパスを PATH 環境変数に追加し、libzmq-v100-mt-gd-3_2_2.dll を同じ場所に配置します。この方法は PATH 変数を汚染し、壊れやすい可能性があります。
  • プラグインが必要とする libzmq-v100-mt-gd-3_2_2.dll に静的にリンクするのではなく、動的リンクを使用します。そうすれば、LoadLibrary を使用して dll をロードする場所を直接制御できます。この方法の他の利点は、プラグインが必要とするライブラリが見つからない場合でも、プラグインをアクティブ化できますが、機能が低下するか、少なくとも意味のあるエラー/ログ メッセージを提供できることです。
于 2013-02-09T07:56:16.447 に答える
0

私は最近、ブログ投稿でこの正確な問題に対処しました: http://otb.manusoft.com/2013/01/using-delayload-to-specify-dependent-dll-path.htm

于 2013-02-12T04:58:07.840 に答える