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,多实例内嵌窗口服务
这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
- 010.Delphi插件之QPlugins,遍历服务接口
这个DEMO注意是用来看一个DLL所拥有的全部服务接口 演示效果如下 代码如下: unit Frm_Main; interface uses Winapi.Windows, Winapi.Messag ...
- 008.Delphi插件之QPlugins,服务的两种调用方法
这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类.点击不同的按钮,使用不同的方法来调用这个服务. 效果界面如下 unit Frm_Main; inte ...
- 006.Delphi插件之QPlugins,多服务演示
演示效果如下 演示工程,全部就一个文件,代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...
- 015.Delphi插件之QPlugins,FMX插件窗口
内嵌FMX的插件窗口,效果还是很可以的.退出时,会报错,很诡异啊. 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messa ...
- 014.Delphi插件之QPlugins,MDI窗口
不知道为什么,这个DEMO编译出来报错,运行不了,在QDAC群里问了一下也没人响应. 效果如下 主程序代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- 013.Delphi插件之QPlugins,模块化代码示例
这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...
- 007.Delphi插件之QPlugins,插件的卸载和重新加载
效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...
随机推荐
- STM32的程序升级
IAP基础参考http://www.eeworld.com.cn/mcu/2018/ic-news112042038.html https://blog.csdn.net/tq384998430/ar ...
- linux 基本命令学习总结
1. linux的目录结构 (linux核心:一切皆文件) 目录结构解释 (主要的有 /etc /home /mnt /opt /usr /tmp) 相对路径和绝对路径的区别 绝对路径 ...
- LaTeX 使用笔记
实现一个归类样式,如图: 代码: \left\{ \begin{aligned} 监督学习 \left\{ \begin{aligned} 回归 \\ 分类 \end{aligned} \right. ...
- C/C++ - 多线程
前几天简单对C和C++中的创建多线程的函数进行了测试,这篇随笔就简单介绍一下创建线程的相关函数. C中三个创建线程函数:pthread_create()._beginthread().CreateTh ...
- 设计模式课程 设计模式精讲 8-3 单例设计模式-DoubleCheck双重检查实战及原理解析
1 课程讲解 1.1 为何要使用双重检查 1.2 双重检查的缺点 1.3 指令重排序讲解 1.4 指令重排序比喻(自己理解) 1.5 如何解决指令重排序问题 2 代码演练 2.1 代码演练1(双重检查 ...
- python 中的 赋值 浅拷贝 深拷贝
1.对象的赋值 都是进行对象引用(内存地址)传递,即 b is a ,a 变 b也变 2.浅拷贝 会创建一个新的对象,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址) 当我们使用下面的操作 ...
- node指针
- Django线上项目后台admin不显示问题
记一次django项目的线上部署错误,django+nginx 一.问题描述 在将django项目部署到阿里云(nginx作为web服务器)上之后发现出现后台管理界面admin不显示样式. 二.问题分 ...
- myBatis 操作 mysql时,使用 like 关键进行模糊查询的方法
参考:https://blog.csdn.net/rainbow702/article/details/50519424 like CONCAT('%', #{mkName}, '%')
- SQL注入个人理解及思路(包括payload和绕过的一些方式)
首先本文主要是把我对SQL注入的一些坑和最早学习SQL注入的时候的一些不理解的地方做一个梳理. (本文仅为个人的一点皮毛理解,如有错误还望指出,转载请说明出处,大佬勿喷=.=) 什么是SQL注入呢? ...