2016-04-23 12 views
1

ネイティブC++でWindowsアプリケーションプラグイン(DLLとして)を作成しています。それをmyplugin.dllとしましょう。私のプラグインは、other.dllという別のDLLを参照しています。暗黙的other.dllプラグインDLLによって参照されるDLLの検索パス

application.exe 
plugins\ 
    myplugin\ 
     myplugin.dll 

myplugin.dllリンク:

私のプラグインは、アプリケーションのpluginsディレクトリのmypluginサブディレクトリにインストールされています。 other.dllは仮想メソッドでクラスを公開し、仮想メソッドテーブルはデータと見なされるため遅延ロードできません。遅延読み込みDLLからはインポートできません。

私は自然にmyplugin.dllの隣に、plugins\mypluginディレクトリにother.dllを配置したいのですが、other.dllsource)を検索するときに、デフォルトではWindowsがplugins\mypluginに見えません。

other.dllをアプリケーションのルートディレクトリに配置する以外に、私の選択肢は何ですか?

(質問はAltering DLL search path for static linked DLLと関連していますが、それは意味をなさないシナリオです:アプリケーションが暗黙的にプラグインDLLとリンクしています。この明確な典型的なシナリオが、その結果が可能であるかどうmyplugin.dllは、アプリケーションによってロードされるときに明示的other.dllをロードするなどの一般的な問題、)

編集:別の類似の質問:Plugin DLLs that depend on other DLLs

編集:私は見、問題への解決策を見つけました以下の回答を受け入れました。私が知る限り、これは最もクリーンなソリューションです。私はそれが他の人を助けることを望む。

+0

PATHで見つかったディレクトリはどうですか?あなたが投稿したリンクはちょうどこれを言います。 – PaulMcKenzie

+2

[静的リンクDLLのDLL検索パスを変更する]の可能な複製(http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – gdlmx

+1

@PaulMcKenzie PATHを変更することは非常に煩雑で、副作用があり、基本的にインストーラプログラムが必要です(つまり、純粋な "xcopy-deployment"はもはや不可能です)。 –

答えて

1

私の質問に対する最後のコメントで概説したアイデアは良いものであることが判明しました。

myplugin.dllは、shimというDLLに変更されました。私の場合、シム、plugins\myplugin\を含むディレクトリから(LoadLibraryを使用して)

  1. これは、最初にロードother.dll:そのシムのエントリポイントは、以下の動作を行います。
  2. その後、同じディレクトリから "実際の"プラグインであるmyplugin-impl.dllをロードします。
  3. 単に前方、その後

myplugin.dll実際の仕事をしていませんmyplugin-impl.dllへのすべての呼び出し。

myplugin-impl.dllはまだ暗黙的にother.dllにリンクしています。しかし、myplugin-impl.dllがロードされると、other.dllがシムによってアプリケーションのプロセスのアドレス空間にロードされているので、それ以上のロードは行われません。

このソリューションでは、暗黙的に読み込まれたDLLの読み込みの利点(特に、仮想メソッドを読み込むC++クラス)が得られます。