2009-07-28 9 views
23

私はプラグインを読み込む能力を持っている必要がありますデルファイのアプリを書いています。私はプラグインシステム/マネージャとしてJvPluginManagerを使用しています;)新しいプラグインウィザードでは、.dllプラグインの代わりに.bplタイププラグインを使用する方が良いと言います...このソリューションとdllプラグインの違いは何ですか?このソリューションの これまでのところ私が見つけた唯一の短所:私がプラグインをロードしているときに共通含む他のパッケージに関するすべてのエラーをスローしないように、別のパッケージ内のすべての共通のインターフェースユニットを配置する必要がありDelphiアプリケーション用のプラグインシステム - bpl対dll?

  1. ユニット

  2. もし、プラグインの開発者の一人が、デフォルトでランタイムパッケージを持たない(シナプスのような)いくつかのよく知られたユニットを使用することを決めたとすると、2番目のプラグイン開発者は ...ここはクラッシュです...

ランタイムパッケージでコンパイルされたDLLではなく、実際にはbplsを使用するのは何ですか?

ありがとうございます。

答えて

16

BPLのもう一つの欠点。 Delphiのバージョンを切り替えると、新しいプラグインを再配布する必要があります。完璧なプラグインシステムを見つけようと試みた多くの試みの後、私はCOMで終わったし、決してその決断を後悔していない。 8年以上にわたってプラグイン要件がある商用アプリケーションでは、アプリケーションは引き続き進んでいますが、最初の反復でリリースされたプラグインのいくつかは依然としてオリジナルの形式で存在します。

この方法を選択した場合は、まずは簡単なインターフェイスから始め、新しいインターフェイスを追加します。基本インターフェースを変更する必要はないので、シンプルで甘いものにしてください。

+0

に基づいているので、おそらくそうする必要があります。COMベースのプラグインアーキテクチャをどのように実装したかについての詳しい情報を提供できますか? –

+0

基本的な前提は、共通インタフェースを作成し、そのインタフェースを実装するcomオートメーションオブジェクトを作成することです。親プログラムは、必要な動作に必要な特定のcomオートメーションオブジェクトを呼び出します。私は利用可能なプラグインとそれぞれの特定のものを呼び出すために必要なユニークなクラスguidを別々に検索しました。クラスGUIDは、ALSOが共通プラグインインタフェースを実装した個々のオートメーションオブジェクト用です。 – skamradt

4

あなたの最初の詐欺はプロです。各dllで共有コードを複製すると、dllはますます大きくなります。 DLLを使用している場合でも、共有コードを別のDLLに移動することでこれを防ぐことができます。

長所:

  1. 種類が共有されています。 TFontはTFontの問題ではありません。
  2. メモリマネージャが共有されています。文字列とクラスは問題なくプラグイン間のパラメータとして使用できます。

短所:

  1. プラグインはDelphiやBCBを使用して構築することができます。
  2. プラグインは同じDelphiまたはBCBバージョンを使用する必要があります。

COMを使用することを検討しましたか? COMは型、文字列、クラスを共有することを可能にし、プラグインは多くのプログラミング言語で記述することができます。

+0

メモリマネージャー(「TFontはTFontエラーではありません)」)は、すべてのプラグインDLLとrtlやvclのようなランタイム "ベース"パッケージをコンパイルする場合にも共有されます。ポイント。 私のプラグインは実際にはコードを共有していません。一般的なユニットにはインターフェイス定義しか含まれていません... "共有されたbplsとbplのプラグインでコンパイルされたDLL"; – migajek

+0

dllはランタイムパッケージでビルドするのが正しいです。しかし、あなたはDLLのために同じ問題を抱えています:) –

+0

私は確信していませんが、MicrosoftはCOMとDCOM技術を非難していると思います。 –

2

私はJvPluginManagerに慣れていませんが、どのようにBPLを使用するかによって異なります。

基本的に、BPLは通常のDLLですが、その初期化/ファイナライズ作業はDllMainから取り除かれ、 'Initialize'/'Finalize'という機能が分離されています。

通常のDLLのようにBPLを使用する場合は、私が知っている点はありません。唯一の利点は、DllMainの問題はなくなります。それで全部です。唯一の違いです。

しかし、DelphiのBPLはコードを共有する便利な方法を提供します。これは、大きなメリット(共通メモリマネージャ、重複コードなしなど)を意味します。だから通常のBPLは "単なるDLL"ではありません。 これはまた、プラグインシステムがDelphiのみに限定されていることを意味します(C++ Builderでも可能です)。私。プラグインとexeの両方を、同じコンパイラでコンパイルしてスムーズに実行しなければなりません(MUST)。

MS Visual Studioなし、いいえ、ありません) - その後、BPLのすべての機能を使用できます。

P.S.しかし、BPLのプラグインをアップグレードすることは、インターフェイスの面を慎重に設計しなければ、悪夢になる可能性があります。最悪の場合、すべてを再コンパイルする必要があります。 P.P.S.私が言ったように:私はそれがプラグインにどのように適用され、JvPluginManagerによって作成されたか分かりません。

+0

私のインターフェイスはいくつかのデルファイ固有の型(例:TFormなど)を使用しているため、デルファイ以外の言語を使用する可能性をあらかじめ決めています) 基本オブジェクトの場合でもラッピングインタフェースを記述すると時間がかかります私のために... – migajek

+0

デルファイのバージョンの事に注意してください。 RAD Studioのバージョン(BCBとDelphiを同じバージョンで使用している場合のみ)が動作するかもしれません。パッケージは.BPL –

8

アレクサンダー氏によると、BPLは基本的にDLLです。

  • ユニットのみBPLの+のエグゼに一度存在することができます。しかし、(:http://wiki.freepascal.org/packages私が作っそれほど短くない要約からの)いくつかの条件があります。これにより、状態の重複(ヒープマネージャーやシステムの他のグローバル変数、VMTテーブルなど)が回避されます。
  • .BPLは他の.BPLのみを使用できます。
  • これは、ansistringやIS/ASなどの動的なタイプがBPLインターフェイスで正常に機能することを意味します。
  • 初期化とファイナライズは別々の手順であり、初期化の順序は厳密に制御されています。静的動的ロードの場合、これは簡単です。動的ロード(プラグインのような)では、ユニットのすべての依存関係がチェックされます。
  • すべては本質的に1つの大きなプログラムです。つまり、BPLは同じコンパイラバージョンとRTLでコンパイルされ、バージョンに依存します。 Delphiのバージョンが一致する必要があるため、.BPLを既存のEXEにプラグインするのは難しいかもしれません。
  • これはまた、あなたが(非デルファイ)のため.DCP年代を提供しなければならないことを意味プラグイン.BPLsは要するに

に依存.BPLs:プラグインアーキテクチャが開いている場合は、そのDLLします。さもなければ、人々はプラグインを書くために全く同じDelphiバージョンを持っていなければなりません。

ハイブリッドも可能です。あなた自身と選択された開発者にファクタリングする機能のためのより高いレベルの.BPLインタフェースと、残りの部分のためのロックボトムプロシージャDLLインタフェース。

3番目のオプションはDLLを使用していますが、Sharememを指定します。ストリングが動作し、複数のDelphiバージョンが動作します。オブジェクトは機能することができますが、安全ではありません(たとえば、以前のバージョンのD2009が動作しないなど)。他の言語ユーザーでも、Delphi以外のものを完全に除外するのではなく、COM上で割り当てることができます。

1

ソフトウェアを使用してbplの大きな袋を出荷する必要があるため、配布が大量になるため、blpアプローチは避けてください。

私たちはなぜDelphiを使用して、ランタイム依存性がなくてもどこでも実行できる小さなスタンドアロンプ​​ログラムをコンパイルします。 bplsを使用するということは、この目的を破ることを意味します。

DLLをどの程度快適に使用できるかわかりませんが、DLLを使用することをお勧めします。

  • これは( は、お使いのソフトウェアに興味を持ってもらう場合があります)、他の開発者 にそのことができ、自分の のプラグインを書くために(限り、その言語 は、DLLを吐き出すことができたように)あらゆる開発 の言語を使用する機会を提供します開発されたソフトウェア で使用されます。
  • 別のことは、デルファイのvclバージョン 依存性の暴君から保存された になるということです。デルファイのメジャーウィーク ポイントまで。
+0

私は、プラグインがいくつかの機能を他のプラグインに公開する可能性があるため、DLLを使用することに決めました - したがって、第2プラグインがインストールされている場合、最初のプラグインがその機能を使用できます。そうでない場合、それは失敗しませんが、拡張可能性はありません。とにかくこれは、 "common interface package"で両方のパッケージをコンパイルすることを意味し、存在しない場合は動作しません。も意味ない。 TFormなどの基本クラスのラッパーを書くことは不可能なので、他の環境(非VCL)で書くことはできません。 – migajek