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,多实例内嵌窗口服务

[QPlugins]学习大纲

[QPlugins]概述

Jmeter插件之ServerAgent服务器性能监控工具的安装和使用

数据库 之 Mysql半同步复制

在 Windows 中使用 Subfolder/*/FolderToDelete 删除所有文件夹的命令行?