3

私はユニットでクラスを持っています。通常、そのメソッドのアルゴリズムを変更すると、それを再コンパイルして、パッチ全体を配布する必要があります。DLLを使ってクラスのインスタンスを作成しようと思います。delphi.about.com で検索したところ、DLL を使用する代わりに BPL を使用できることがわかりました。Delphi 用の DLL です。問題は、私が見つけたほとんどすべての例が、関数をエクスポートする方法のみを示していることです。BPL を動的にロードしたいのですが、BPL を置き換えるたびに、エクスポートする関数だけでなく、クラスの最新のアルゴリズムを取得できます。

私が読んだ記事:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
- Delphi アプリケーションのプラグイン システム - bpl vs dll?
- http://delphi.about.com/library/weekly/aa012301a.htm

コンポーネントまたはクラスをカプセル化するために BPL をゼロから作成する方法の URL またはサンプルは大歓迎です。


親愛なる達人へ

次のようなコードがあるとします。

unit unitA;

interface

type
  B = class(TObject)
  public
    procedure HelloB;
  end;

  A = class(TObject)
  public
    function GetB: B;
    function HelloA: String;
    procedure Help;
  end;

  implementation

  uses
      Dialogs;

  { B }

   procedure B.HelloB;
   begin
     ShowMessage('B');
   end;

  { A }

  function A.GetB: B;
  begin
    Result := B.Create;
  end;

  function A.HelloA: String;
  begin
    Result := 'Hello, this is A';
  end;

  procedure A.Help;
  begin
    //do something
  end;

  end.

A のパブリック メソッドをすべてエクスポートしたいのですが、どうすれば DLL にできますか? インポート先の別のユニットから使用する方法は? まあ言ってみれば:

 var a: A;

 a := A.Create;
 a.GetB;
 showMessage(a.HelloA);

A はユニットで宣言されていません (DLL 内にあります)。お知らせ下さい。


万歳。昨夜手に入れました。私がしなければならないのは、DLL によって返されたオブジェクトのインスタンスをキャッチするために呼び出し元ユニットで使用されるインターフェイスをオブジェクトに実装させることだけです。

皆さん、ありがとうございました。

4

6 に答える 6

4

メイソンはすでにそれを釘付けにしましたが、BPLがあなたが探しているものではない理由について詳しく説明させてください。BPLは、DelphiIDEが同じメモリマネージャとRTLを共有するコンポーネントをロードするための手段です。(タイプIDは、BPLを使用してほぼ透過的に機能します)

ただし、拘束されている依存関係は、ほとんどの場合受け入れられません。とにかく異なるバージョンのRTLとVCLを処理できないIDEを除いて。

アプリケーションとそのDLLの間でインターフェイス参照のみを渡す場合、RTL、VCL、または共有パッケージを共有する必要はまったくありません。

また、いくつかのDLLを別の言語(C ++、C#、FPC、別のDelphiバージョン)で記述しても、オブジェクトを使用できることも意味します。これは、メインアプリを移植したくないが、DelphiまたはDelphiのバージョンで使用できない既存のライブラリを使用したい場合に魅力的です。

于 2009-11-10T01:07:30.160 に答える
2

クラスを外部ファイルに入れる際の問題は、メインアプリケーションがそれを参照するための何らかの方法を知っている必要があることです。必要なすべてのメソッドを仮想メソッドとして公開する基本クラスから派生するか、必要なすべての機能を含むインターフェイスを実装する必要があります。

オブジェクトのインターフェイスがどのように見えるかをすでに知っていて、変更するのが内部アルゴリズムなどの実装の詳細だけである場合、おそらく最も簡単な方法は、クラスにインターフェイスを実装させ、それをエクスポートするDLLに配置することです。このインターフェイスのインスタンスを返す関数。そうすれば、アプリをパッケージに分割することを心配する必要がなくなります。これは非常に面倒な作業になる可能性があります。

于 2009-11-09T11:51:38.663 に答える
2

I see nothing in your problem description suggesting you would need to explicitly export anything from the package or that you would need to load it dynamically at run time. Instead, it's enough that your functions reside in a run-time package that can be replaced separately from the main program.

Start a new package project and move your class's unit into that project along with any other units it depends on. Compile the project. If the compiler warns about "implicitly including" any other units, add those to the package, too.

Now, remove any of the package units from the EXE project. There should be no units that are members of both projects. Next, turn on the "build with run-time packages" checkbox in your EXE's project options. Add your package to the semicolon-separated list of package names. The RTL and VCL packages will probably also be on that list.

Compile both projects, and you're done.

If you make changes to your class implementation, you can recompile the package only and send a new version to customers. The program will automatically get the new changes when you replace the original file with the new one. The package is listed in the program's import table, so the OS will automatically load the BPL file when it loads the EXE. The EXE doesn't need to run any special code to load the package.

于 2009-11-09T15:01:05.263 に答える
0

Delphiは、関数をエクスポートするDLLまたはコンポーネントをエクスポートするBPLを作成できます。

コンポーネントを作成してコンパイルすると(メインアプリと同じコンパイラ設定を使用)、Delphiが.bplを作成します。次に、このコンポーネントをDelphiにインポートし、このコンポーネントをパッケージとして使用してアプリをコンパイルします。

Delphi 4で作成されたコンポーネントでの私の経験は、1つの大きなアプリケーションが個別の.bplsを持つアプリケーションよりも信頼性が高いことを証明しました。これはマルチスレッドサーバーであり、スタンドアロンでコンパイルすると正常に動作しましたが、パッケージでコンパイルすると短時間でクラッシュしました。この分野でDelphiの新しいバージョンが改善されることを願っています。

メモリ管理(アプリではパッケージに割り当てられたメモリを解放しない、またはその逆)とコンパイラ設定に注意してください。

about.comが気に入った場合は、このリンクが役立ちます。パッケージの概要。BPLは特別なDLLです!

于 2009-11-09T11:43:16.187 に答える
0

MAFコンポーネントを試すことができます.MAFコンポーネントは、追加のコードなしでプラグインなどを処理します. チュートリアルとソース付きのデモ アプリケーションが付属しています。

http://www.maf-components.com

于 2009-11-26T23:01:23.280 に答える
0

BPL には用途があります。たとえば、Erp のような非常に巨大なアプリケーションを作成する必要がある場合は、BPL を真剣に使用する必要があります。

一方、BPL はアプリケーションのクラッシュには関与しません。BPL の不適切な使用が原因です。

于 2009-11-09T14:11:19.037 に答える