009.Delphi插件之QPlugins,服务的热插拔
Posted tianpan2019
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了009.Delphi插件之QPlugins,服务的热插拔相关的知识,希望对你有一定的参考价值。
这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下
代码如下
unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, qplugins_base, QPlugins; type // 定义一个接口,方法由子类来实现 IEchoService = interface [‘E9A9E0D8-F278-46CC-9AA4-7FCD9CDAB77F‘] function Echo(S: string): string; end; // Echo接口的实例 TEchoService = class(TQService, IEchoService) function Echo(S: string): string; end; TEchoReplacement = class(TInterfacedObject, IEchoService) function Echo(S: string): string; end; TForm_Main = class(TForm) Button1: TButton; Memo1: TMemo; Panel1: TPanel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private Private declarations FReplaced: IEchoService; public Public declarations end; var Form_Main: TForm_Main; implementation $R *.dfm // 按钮_调用服务 procedure TForm_Main.Button1Click(Sender: TObject); var AService: IEchoService; begin // PluginsManager函数返回全局PluginsManager实例 AService := PluginsManager as IEchoService; // 服务存在,则调用 if Assigned(AService) then begin Memo1.Lines.Add(AService.Echo(‘服务插件‘)); end; end; // 按钮_替换服务 procedure TForm_Main.Button2Click(Sender: TObject); var AService: IQService; begin // 在指定的父结点下,查找指定路径的服务 AService := FindService(‘/Services/Echo‘); // 如果服务存在 if Assigned(AService) then begin // 撤销替换服务 if Assigned(FReplaced) then begin AService.RemoveExtension(FReplaced); FReplaced := nil; Button2.Caption := ‘替换服务‘; end else begin // 替换服务 FReplaced := TEchoReplacement.Create; AService.AddExtension(FReplaced); Button2.Caption := ‘撤销替换‘; end; end; end; TEchoService // 原Echo函数 function TEchoService.Echo(S: string): string; begin Result := Format(‘类名[%s]: %s‘, [ClassName, S]); end; TEchoReplacement // 新Echo函数 function TEchoReplacement.Echo(S: string): string; begin Result := Format(‘新类名[%s]: %s‘, [ClassName, S]); end; // 创建 procedure TForm_Main.FormCreate(Sender: TObject); begin // 注册TEchoService服务 RegisterServices(‘/Services‘, [TEchoService.Create(IEchoService, ‘Echo‘)]); end; end.
以上是关于009.Delphi插件之QPlugins,服务的热插拔的主要内容,如果未能解决你的问题,请参考以下文章
012.Delphi插件之QPlugins,多实例内嵌窗口服务