5

DELPHI アプリケーション用の外部モジュール システムを実装する最良の方法は何ですか?

私が必要とするのは、本当に非常に基本的なものです:

  • メインアプリは、モジュールが存在するかどうかを検出してロードします(実行時)
  • モジュールはフォームを保存できます
  • モジュールは DataModule を格納できます
  • モジュールはコードを保存できます

ストア フォームを他のフォーム内で使用する必要があり、スタンドアローンとしてのみ使用する必要があります

私はこのようなものを使用します

        if Assigned(pNewClass) then begin
            Application.CreateForm(pNewClass, _lFrm);
            _lFrm.Hide;
            _lFrm.BorderStyle := bsNone;
            _lFrm.Parent := pBasePNL //(TPanel);
            _lFrm.Align := alClient;
        end;

そこで、TForm を作成しますが、TPanel 内に配置します。

DataModules に関しては、私は通常 ImageLists を保存するので、外部モジュールを少し変更するだけでアプリの ICO を変更することが考えられます。

では、これを達成するための最良の方法は何ですか?

ランタイム BPL を見ましたが、その方法を理解していないようです。ありがとう。

アップデート : .....................................

関連する質問と回答をいくつか読んだ後、回答と解決策を見つけたと思います。

http://edn.embarcadero.com/article/27178

記事は古いものですが、驚くほどシンプルです。

ロジックはありますが、フォームを表示するまでには至っていないようです </p>

私はちょうど例2をテストしています

BPL をロードしますが、フォームを取得しません。

AClass := GetClass('TForm2');

常に取得 x 'nil'</p>

しかし、登録された BPL は次のようになります。

RegisterClass(TForm2);

誰でもこれを手伝ってもらえますか。

4

2 に答える 2

4

パッケージは簡単な解決策ですが、大きな欠点が 1 つあります。パッケージを使用すると、プラグイン作成者は Delphi だけでなく、同じバージョンのコンパイラを使用することになります。

個人的には、アプリの機能を多くのインターフェイスを通じて公開したいと考えています。これにより、Delphi 以外の言語からのアクセスが可能になります。

通常、プラグインは DLL に実装され、アプリを表すルート インターフェイスに渡すためにアプリが呼び出す関数をエクスポートします。次に、プラグインはそのインターフェースのメソッドを呼び出し、双方向の対話を確立します。

于 2011-08-20T12:02:00.930 に答える
3

デモを作成しました。とても簡単に始められます。しかし... 開始は終了ではありません。

プラグインを使い始めるたびに、後で後悔しました。ただし、おっしゃる通り、バイナリ プラグイン システムが必要です。したがって、BPL は正しいソリューションです。David は、(完全なランタイム パッケージ BPL の代わりにプレーンな DLL を使用して) インターフェイスを使用することを提案しています。これにより、クラスのバージョン管理を行わないためによく発生する BPL の不安定性の問題の一部が解決され、アプリケーションとパッケージのバイナリ互換性の依存関係が解決されます。ちゃんと。メモリを共有する必要がなく、borlandmm.dll (共有メモリ管理) を使用する必要がない場合は、インターフェイスを備えたストレート DLL で問題なく動作します。

スクリプトだけで必要なすべてのことを実行でき、スクリプトだけでプラグイン システムを作成できる場合は、そのようにしてください。DLL、インターフェイス、およびメモリ共有なしで問題を解決できる場合は、プレーンな DLL を使用してください。メモリとクラスの型を共有する必要がある場合は、はい、BPL を使用します。

BPL (ランタイム パッケージ) を使用すると、予期しない多くの副作用が生じることに注意してください。私が取り組んできた最大の BPL ベースのアプリケーションは、私が取り組んだどのモノリシック アプリよりも混乱しており、不安定でした。パッケージを試してみるまでは、パッケージを探すしかないようです。

BPL パッケージを正しく使用し、プラグインのバージョンを適切に設定していれば、すべて問題ありません。BPLは素晴らしいです。しかし現実の世界では、健全なバージョン管理、ABI の互換性と相互運用性、および安定性が重要視されているようです。

更新:ここ にあるデモを作成しました(plugin_r2.zip)。これは Delphi XE で行われましたが、古いバージョンの Delphi を使用している場合は、.dproj ファイルを削除して、メイン アプリの .dpr ファイルとパッケージの .dpk を開くだけです。

于 2011-09-01T09:23:42.763 に答える