BPLを使用してDelphiのオブジェクトの実行時のロード
質問
私は、ユニット内のクラスを持っています。私は、そのメソッドのアルゴリズムを変更したときに通常、私はそれを再コンパイルし、全体としてのパッチを提供しなければなりません。 私は、DLLを使用してクラスのインスタンスを作成すると思います。 delphi.about.comで検索した後、私が代わりにDLLを使用しての、私はBPLを使用できることがわかりました。これは、デルファイのためのDLLです。問題は、私は唯一の関数をエクスポートする方法を語っていほとんどすべての例です。 私はエクスポート機能だけでなく、私は動的にBPLをロードしたい、と私はBPLを交換するたびに、私はクラスの最新のアルゴリズムを得ることができます。
私が読んだ記事:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll .htmのの
- Delphiアプリケーションのためのプラグインシステム - dllの対BPLする <? BR>
- 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.
私はそれDLLにする方法A.のすべてのパブリックメソッドをエクスポートしたいですか? どのようにそれをどこにインポートするには、別のユニットからそれを使用するには? さんが言わせます:
var a: A;
a := A.Create;
a.GetB;
showMessage(a.HelloA);
Aは、(それがDLLである)単位で宣言されていません。 助言してください。
<時間>万歳。私は昨夜それを得ました。私がしなければならないのは、オブジェクトがDLLによって返されたオブジェクトのインスタンスをキャッチするために、発信者のユニットで使用されているインターフェイスを実装しますです。
すべてのいただきありがとうございます。
解決
外部ファイルにクラスを置くの問題は、メインアプリケーションがそれを参照するためにいくつかの方法を知っている必要があるということです。それはあなたが仮想メソッドとして必要なすべてのメソッドを公開基底クラスから派生し、またはあなたはそれから必要なすべての機能が含まれているインターフェイスを実装する必要がありますどちらか。
あなたはすでにオブジェクトのインタフェースがどのように見えるかを知っている、とあなたが変更しているすべては、このような、おそらく最も簡単な方法は、あなたのクラスがインタフェースを実装して作成し、DLLにそれを置くことであろう内部アルゴリズムとして実装の詳細をである場合すなわち、このインタフェースのインスタンスを返す関数をエクスポートします。その方法は、あなたが本当の面倒なことができ、パッケージにアプリケーションを壊す心配する必要はありません。
他のヒント
メイソンはすでにそれを釘付け、しかし、私はBPLSはあなたが探しているものではありません理由について詳しく説明しましょう。 BPLSは同一のメモリマネージャとRTLを共有するコンポーネントをロードするDelphiのIDEのための手段です。
(タイプIDがBPLSを使用して、ほとんど透過的に動作します)しかし、あなたが縛らなっている依存関係は、ほとんど常に受け入れられません。とにかくRTLとVCLの異なるバージョンを扱うことができないIDEを除きます。
あなただけのアプリケーションとそのDLLを間の参照を渡すとインタフェース、その後は全くRTL、VCLまたは共有パッケージを共有する必要はありません。
また、あなたが(C ++、C#、FPC、他のDelphiのバージョン)別の言語でいくつかのDLLを書き、まだオブジェクトを使用することができることを意味します。あなたはどちらのポートをメインのアプリにしたくないときに魅力的なことが、まだデルファイ、またはデルファイのバージョンに利用できない既存のライブラリを使用することができます。
私はあなたが明示的にパッケージからか、実行時に動的にロードする必要があるだろうと何をエクスポートする必要があります示唆あなたの問題の説明に何も表示されません。代わりに、それはあなたの機能は、メインプログラムとは別に交換することができ、実行時パッケージに存在していることだけで十分です。
新しいパッケージのプロジェクトを開始し、それが依存する他のユニットと一緒にそのプロジェクトにあなたのクラスのユニットを移動させます。プロジェクトをコンパイルします。コンパイラは、他のユニット「暗黙的に含む」について警告した場合は、あまりにも、パッケージにそれらを追加します。
さて、EXEプロジェクトからパッケージユニットのいずれかを削除。両プロジェクトのメンバーで何台あってはなりません。次に、あなたのEXEのプロジェクトオプションで「実行時パッケージをビルドする」のチェックボックスをオンにします。パッケージ名のセミコロン区切りのリストにあなたのパッケージを追加します。 RTLとVCLのパッケージは、おそらくもそのリストになります。
両方のプロジェクトをコンパイルし、設定が完了します。
あなたのクラスの実装を変更した場合は、、あなただけのパッケージを再コンパイルし、お客様に新しいバージョンを送ることができます。あなたが新しいものに元のファイルを置き換えたときにプログラムが自動的に新しい変更を取得します。それはEXEをロードする際にOSが自動的にBPLファイルをロードしますのでパッケージは、プログラムのインポートテーブルにリストされています。 EXEは、パッケージをロードするために特別なコードを実行する必要はありません。
Delphiはコンポーネントをエクスポートする機能やBPLをエクスポートするDLLを作成することができます。
あなたは、コンポーネントを作成します(あなたのメインのアプリと同じコンパイラ設定を使用して)それをコンパイルし、Delphiは.BPLが作成されますすることができます。そして、パッケージとしてのDelphiに、このコンポーネントをインポートして、このcompomponentを使用してアプリケーションをコンパイルします。
デルファイ4で作成したコンポーネントと私の経験では1、大きなアプリケーションが別々の.bplsでアプリケーションよりも信頼性があることを証明しました。これは、マルチスレッドサーバーだったとパッケージを使用してコンパイルした場合、短い時間後に墜落しながら、スタンドアロンをコンパイルした場合、それがうまく働きました。私は、Delphiの新しいバージョンは、この領域で改善を願っています。
とコンパイラの設定(アプリではない自由memeoryは、パッケージおよびその逆に割り当てられない)メモリー管理に注意してください。
あなたが好きならabout.comは、このリンクは有用であろう:の概要パッケージ; BPLSは特殊なDLLです!の
BPLSは、その使用を持っています。あなたはErpのような非常に巨大なアプリケーションを作るために持っている場合たとえば、あなたが真剣にBPLSを使用しようとする必要があります。
一方で、BPLSは、クラッシュするアプリケーションの責任を負いません。 BPLSの悪い使い方はそれをしない。
あなたはMAFコンポーネントを試すことができ、彼らはプラグインに対応し、余分なコードなしであなたのためにはるかに。チュートリアルとソースとデモアプリケーションが付属しています。