47

C ++のプラグインシステムは、ABIが適切に定義されておらず、各コンパイラ(またはそのバージョン)が独自のルールに従っているため、困難です。ただし、Windows上のCOMは、さまざまなコンパイラを使用するプログラマーが単純なインターフェイスを使用してホストアプリケーションのプラグインを作成できる最小限のプラグインシステムを作成できることを示しています。

実用的にして、この点ではあまり役に立たないC++標準を少し脇に置いておきましょう。C ++プラグインをサポートするWindowsおよびMac(およびオプションでLinux)用のアプリを作成したい場合、およびプラグインの作成者に適度に多くのコンパイラー(たとえば、2年未満のバージョンのVisual C ++)を提供したい場合、GCCまたはIntelのC ++コンパイラ)、C ++のどの機能を信頼できますか?

もちろん、プラグインは特定のプラットフォーム用に作成されると思います。

私の頭から離れて、ここに私が考えることができるいくつかのC ++機能があります、そして私が思うのは答えです:

  • vtableレイアウト、抽象クラスを介してオブジェクトを使用するには?(はい)
  • 組み込み型、ポインタ?(はい)
  • 構造体、組合?(はい)
  • 例外?(いいえ)
  • extern "C"関数?(はい)
  • 組み込みパラメーター型を持つstdcall非外部「C」関数?(はい)
  • 非stdcall非extern「C」関数とユーザー定義のパラメータータイプ?(いいえ)

その分野での経験を共有していただければ幸いです。C ++プラグインシステムを備えた適度に成功したアプリを知っているなら、それもクールです。

カール

4

8 に答える 8

25

Dr Dobb's Journalには、「独自のプラグインフレームワークの構築:パート1」という記事があります。これは、このテーマについてかなりよく読んでいます。これは、C / C ++クロスプラットフォームプラグインフレームワークのアーキテクチャ、開発、および展開をカバーする一連の記事の始まりです。

于 2008-09-04T08:11:53.327 に答える
6

また、従来のプラグインインターフェイスをスクリプトインターフェイスに置き換えることを検討することもできます。すでに問題を解決しているC/C++のいくつかのスクリプト言語には非常に優れたバインディングがいくつかあります。それらの上に構築することは悪い考えではないかもしれません。たとえば、Boost.Pythonを見てください。

于 2008-09-04T09:09:07.853 に答える
6

Qtには、私が過去に使用したプラグイン用の非常に優れたシステムがあります。Qt のメタオブジェクト システムを使用して、C++ プラグインを開発しようとするときに通常見られる問題の多くを克服します。

1 つの例はQ_DECLARE_INTERFACE、互換性のないプラグインの使用を防ぐための仕組みです。もう 1 つはbuild keyで、アーキテクチャ、OS、コンパイラに適したプラグインを確実にロードするためのものです。Qt のプラグイン システムを使用しない場合は、これらについて心配し、自分で解決策を考え出す必要があります。それは必ずしもロケット科学ではありませんし、あなたがそれに失敗するだろうと言っているわけではありませんが、Trolltech の連中は非常に頭が良く、それについてしばらく考えてきました。 .

別の例として、RTTIは通常 DLL の境界を越えて機能しませんが、Qt を使用する場合、メタオブジェクト システムに依存するqobject_castなどは DLL の境界を越えて機能します。

于 2008-10-07T01:22:38.563 に答える
3

以下に基づいてプラグインシステムを作成しても安全だと思います。

  • プラグイン機能のライブラリ(.dll、.soなど)へのパッケージ化
  • プラグインが主要なC言語のエクスポートを公開することを要求します。
  • プラグインが抽象C++インターフェースを実装する(そしてポインター/参照を返す)ことを要求する。

おそらく最も成功したC++プラグインシステム:古き良きAdobePhotoshop。そうでない場合は、VSTiなどの仮想シンセフォーマットの1つ。

于 2008-09-04T09:47:25.220 に答える
3

MatthewWilsonによる本ImperfectC++には、これに関する素晴らしい情報があります。

のアドバイスは次のように思われます。同じ(または同等の)コンパイラを使用している限り、C ++を使用できます。それ以外の場合は、C++コードのインターフェイスとしてCを使用することをお勧めします。

于 2008-09-04T09:49:58.897 に答える
2

私はC++プラグインシステムを備えた独自のゲームエンジンを持っています。

ヘッダーファイルにいくつかのコードがあるので、プラグインのコンパイルユニットに入れられます。

メインエンジンに存在するより大きな関数は、エクスポートされたC関数を介して呼び出されます(プラグインはMyObject_somefunction(MyObject * obj)を呼び出し、エンジンではobj-> somefunction()を呼び出します)。C関数の呼び出しがお好みで醜い場合は、ヘッダーのトリックを使用して、ヘッダーがプラグインに含まれているときに、メンバー関数#definedを使用してC関数を呼び出します。

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

仮想関数は純粋であるか、コードがヘッダーファイルに存在する必要があります。クラスから継承しておらず、インスタンス化するだけの場合、仮想関数コードはエンジン内に存在できますが、プラグインから呼び出されるオブジェクトを作成および破棄するために、クラスはいくつかのC関数をエクスポートする必要があります。

基本的に、プラットフォームの完全な独立性を維持することを目的として私が使用したトリックは、Cエクスポートとヘッダーファイルのトリックに相当します。

于 2008-09-04T08:58:26.413 に答える
2

Firefox は XPCOM ( http://www.mozilla.org/projects/xpcom/ ) で動作します。Microsoft COM にインスパイアされていますが、マルチプラットフォームです。

于 2009-08-17T03:20:59.147 に答える
2

ACEには、クロス プラットフォームのプラグイン アーキテクチャがあります。

チェックアウト:

  1. ACE DLL
  2. ACE DLL マネージャー

The ACE Programmer's Guideという本をチェックすることをお勧めします

于 2008-10-07T02:54:54.620 に答える