0

プラグイン パターンで実現されると思われるアプリケーションがあります。
プラグインは dll ファイルにあり、コマンド ライン経由でユーザーから指定されたパラメーターに応じて、その場で読み込みます。つまり、ユーザーが plugin1 を使用したい場合、アプリの実行時にコマンドラインでその名前をパラメーターとして入力し、その場でロードすることになっています。
私はプラグイン パターンを使用しているので、すべてのプラグイン クラスが実装するインターフェイスがあります (C++ で動作するため、抽象クラスです)。
私のジレンマは、インターフェイス クラスをどこに配置するかです。dll をビルドするには、すべての dll でインターフェイスを宣言する必要があります。
インターフェイスを変更する必要がある場合に、すべての dll でインターフェイスを変更する必要を避けたいと考えています。
一方、メイン アプリでインターフェイス クラスを宣言すると、DLL はコンパイルおよびビルドされませんか?
インターフェイス クラスを dll から抽出してメイン アプリに配置する方法についての提案はありますか。そのコードを変更したい場合、多数の場所 (つまり、すべての dll) で変更する必要はありません。 )。

前もって感謝します、

乾杯

4

4 に答える 4

1

インターフェース定義を共通の場所 (例えば \inc サブディレクトリに別の .h ファイル) に保存する必要があり、インターフェースを変更したら、すべてのライブラリを再コンパイルする必要があります。C++ ではそれを回避する方法はありません。インターフェイスを一意に識別する機能が必要な場合は、COM のようなものを使用して、インターフェイスを中断するたびにインターフェイス ID を変更できます (ここでも実装を再コンパイルする必要がありますが、COM を使用すると、DLL 地獄のためにクライアントが未定義の動作に陥ることはありません)。 )。

于 2010-07-29T09:02:28.647 に答える
1

「インターフェース」によって、基本抽象クラスを記述するヘッダーファイルについて話している場合、実際の問題はありません。

複数のプロジェクト間でファイル (ここでは「ヘッダー ファイル」) を共有して使用できます (「プロジェクト」はメイン アプリケーションまたはプラグインの 1 つです)。あなたの場合、それは実際には完全に理にかなっています。

于 2010-07-29T09:03:18.270 に答える
0

すべての DLL には、インターフェイスへのポインターを返す同じエクスポート関数が必要です。各 DLL は、「インターフェイス」(実際にはサブクラス) のインスタンス化を担当する必要があります。したがって、メイン アプリは、DLL で LoadLibrary を呼び出し、GetProcAddress を使用して、DLL でエクスポートされた関数を呼び出します。エクスポートされた関数は、具体的なインターフェイスをインスタンス化し、それへのポインターを返す必要があります。

質問: 「インターフェイスを配置する場所」 回答: 「パブリック」API フォルダー内。

于 2010-07-29T09:03:23.763 に答える
0

私はかつてC#でこれをやったことがありますが、多分それはあなたを助けることができます. メインアプリとプラグインが参照する別のプロジェクトにインターフェイスと抽象クラスを作成しました。そうすれば、必要に応じて編集できる場所が 1 つだけになります。

Main App.exe <-> PluginInterface.dll <-> APlugin.dll

C++ でこれを実現する方法がわからない場合は、プラグイン インターフェイス用に別の dll を作成し、exe とプラグイン dll からロードすることができると思います。

それが役立つことを願っています。

于 2010-07-29T09:05:24.383 に答える