アプリケーションは、それを使用するクラスのベースを認識している必要があります。インターフェイス、プロトコル、仕様、名前を付けます。特定のパッケージは、特定の特殊な実装を提供します。
したがって、BPL と従来のオブジェクトに基づく全体的な構造は、VCL 自体で観察できるものでなければなりません。
Base.BPL -プラグインによって提供される実装が含まTBaseClass
れています。TList<TBaseClass>
また、メイン プログラムが使用するために必要なすべての仮想メソッドとプロパティも含まれています。あると便利
class constructor TBaseClass.CreateClass;
begin
MyList := TList<TBaseClass>.Create;
end;
class destructor TBaseClass.DestroyClass;
begin
FreeAndNil(MyList);
end;
class procedure TBaseClass.RegisterClass;
Begin
MyList.Add(Self);
end;
class procedure TBaseClass.UnRegisterClass;
Begin
MyList.Remove(Self);
end;
App.Exe は、Base.BPL をそのランタイム パッケージ (プロジェクト オプション内) にリストし、Base.BPL をプラグインとの「ミーティング ポイント」として使用します。
Plugin.BPL は、必要なランタイム パッケージとして Base.Bpl をリストし、ランデブーの場所としても使用します。
TMyClass1 = class (TBaseClass);
...
initialization
TMyClass1.RegisterClass;
finalization
TMyClass1.UnRegisterClass;
end.
私の TCustOrder には「Client:TObject」という名前のプロパティがあり、ホスト アプリケーションからこのプロパティにアクセスするにはどうすればよいですか。
type (** Base.BPL **)
TBaseClass = class ...
protected function GetClient: TObject; virtual; abstract;
public property Client read GetClient;
...
end;
type (** Plugin.BPL **)
TMyClass1 = class(TBaseClass) ...
protected function GetClient: TObject; override;
...
end;
少なくとも Delphi XE2 では、動的パッケージをアンロードするときに文字列配列定数が破棄される傾向があることに注意してください。D2010に当てはまるかどうかはわかりません。XE4では修正されました。だから「ドラゴンがここにいるかもしれない」。最新の Delphi では、RTL/VCL に多数のバグがあります。デバッグの準備をしてください。