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.

原文地址:https://www.cnblogs.com/tianpan2019/p/11496687.html

时间: 2024-10-30 04:09:29

009.Delphi插件之QPlugins,服务的热插拔的相关文章

012.Delphi插件之QPlugins,多实例内嵌窗口服务

这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程序中. 界面如下 DLL代码如下: unit Frm_Dll; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Co

006.Delphi插件之QPlugins,多服务演示

演示效果如下 演示工程,全部就一个文件,代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, System.Rtti, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, qstring, QPlugins, qplugins_base,

咏南中间件支持服务端热插拔业务插件

咏南中间件支持服务端热插拔业务插件,中间件不需要停机即可增加和修改业务插件.

Delphi插件创建、调试与使用应用程序扩展

Delphi插件创建.调试与使用应用程序扩展 翻译 : MiracleZ  有没有使用过Adobe Photoshop?如果用过,你就会对插件的概念比较熟悉.对外行人来说,插件仅仅是从外部提供给应用程序的代码块而已(举个例子来说,在一个DLL中).一个插件和一个普通DLL之间的差异在于插件具有扩展父应用程序功能的能力.例如,Photoshop本身并不具备进行大量的图像处理功能.插件的加入使其获得了产生诸如模糊.斑点,以及其他所有风格的奇怪效果,而其中任何一项功能都不是父应用程序自身所具有的.对于

C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了.      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可.但是公司不是所有人都搞C#,也不是所有的程序C#都能很好的完成,又或者其他公司提供的API不是C#的,这个时候,就需要这个框架能够支持多种语言了.      废话不多说,进入正题.     上网一搜,C#加载非托管的dll,无非就是使用 DllImportAttribut

wordpress中安装插件需要ftp服务怎么破

在初次搭建wordpress成功好,笔者想安装wordpress中有趣的插件时缺发现需要ftp服务 天真的笔者还真的搭建了一个ftp服务器,然后发现并没有什么卵用,这只是wordpress为了安 全而留下的坑,那么,怎么绕过这道程序呢.其实很简单,我们只需在wordpress根目录找到一个 wp-config.php,添加以下代码 define("FS_METHOD","direct"); define("FS_CHMOD_DIR", 0777)

delphi 10 seattle 安卓服务开发(一)

从delphi 开始支持安卓的开发开始, 安卓service 开发一直都是delphier 绕不过去的坎, 以前也有开发service  的方法,但是都是手工处理启动文件,而且要修改很多东西,基本上成功 的概率很低. delphi 10 seattle(这个名字很特殊,与win10 一样,直接跳过了9) 终于官方支持安卓service 开发了, 不知道现在现在开发安卓service 是不是很简单?那么就让我们一探究竟. 首先,我们开启已经扁平的不能再扁平delphi 10, 选择建立一个其他项目

delphi 10 seattle 安卓服务开发(二)

关于delphi 10 移动服务开发的几张图

delphi 10 seattle 安卓服务开发(三)

delphi 10 里面的安卓服务有四种,上面的一篇文章里面的图有介绍. 今天做一个remote service 的例子.(里面一部分代码是抄别人的,如果不太清楚,自行恶补) remote service 实际上就是主程序包含服务模块,另外的一个程序可以调用. 由于delphi 10 的低级错误,需要手工修改一些东西.这一块可以参考http://blog.qdac.cc/?p=2839 为了不影响这个例子的顺利完成,本例中没有使用上面的修改.直接在本例中处理. 现在开工: 和以前一样,先建立一个