这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类。点击不同的按钮,使用不同的方法来调用这个服务。
效果界面如下
unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, QPlugins, qplugins_params, qplugins_base; type TForm_Main = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; // 定义一个接口,子类中实现接口方法 IQMyServiceExt = interface [‘{46DD594D-0A3D-49E6-BE86-61E653EB3589}‘] procedure SayHello(AStr: string); end; // 服务扩展的实例 TQMyServiceExt = class(TQInterfacedObject, IQMyServiceExt) private // 接口中Sayhello方法的实现 procedure SayHello(AStr: string = ‘‘); public constructor Create; override; end; // IQMultiInstanceExtension 服务扩展多实例接口 TQMyMultiInstanceExt = class(TQMyServiceExt, IQMultiInstanceExtension) protected function GetInstance(var AResult: IInterface): Boolean; stdcall; end; var Form_Main: TForm_Main; implementation uses qstring; {$R *.dfm} { TQMyServiceExt } // 创建 constructor TQMyServiceExt.Create; begin // 调用祖先类的Create函数 inherited; end; // 接口中Sayhello方法的实现 procedure TQMyServiceExt.SayHello(AStr: string); begin // 输出 if AStr <> ‘‘ then begin Form_Main.Memo1.Lines.Add(AStr); end; Form_Main.Memo1.Lines.Add(‘扩展接口类名为:‘ + ClassName); end; // 创建 procedure TForm_Main.FormCreate(Sender: TObject); var AService: TQService; AExt: IQMyServiceExt; begin // 注册TQMyServiceExt服务 AService := TQService.Create(NewId, ‘Message‘); AService.AddExtension(TQMyServiceExt.Create); RegisterServices(‘Services‘, [AService]); // 注册TQMyMultiInstanceExt服务 AService := TQService.Create(NewId, ‘MultiIntance‘); AExt := TQMyMultiInstanceExt.Create; AService.AddExtension(AExt); RegisterServices(‘Services‘, [AService]); end; { TQMyMultiInstanceExt } // 取服务扩展的实例 function TQMyMultiInstanceExt.GetInstance(var AResult: IInterface): Boolean; begin AResult := TQMyServiceExt.Create; Result := true; end; // 按钮_直接调接口 procedure TForm_Main.Button2Click(Sender: TObject); begin (PluginsManager as IQMyServiceExt).SayHello(‘‘); end; // 按钮_按路径调接口 procedure TForm_Main.Button1Click(Sender: TObject); var AService: IQService; begin AService := GetService(‘/Services/Message‘); (AService as IQMyServiceExt).SayHello(‘‘); end; // 按钮_多实例扩展 procedure TForm_Main.Button3Click(Sender: TObject); var AService: IQService; AExt: IQMyServiceExt; begin // 获取指定路径的服务实例 AService := GetService(‘/Services/MultiIntance‘); AExt := AService as IQMyServiceExt; AExt.SayHello(Format(‘接口实例地址:%X‘, [IntPtr(AExt)])); end; end.