应用程序应该知道要使用它的类的基础。接口、协议、规范,随便你说。特定的包给出了它的某个专门的实现。
所以基于 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 中存在大量错误,请准备好调试它们。