011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用

主程序代码如下
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; type
TForm_Main = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form_Main: TForm_Main; implementation uses
qstring,
qjson,
QPlugins,
qplugins_base,
qplugins_loader_lib,
qplugins_params,
qplugins_router_delayload;
{$R *.dfm} procedure TForm_Main.Button1Click(Sender: TObject);
var
AService: IQService;
AResult: IQParams;
begin
// 通过路径获取指定的服务接口实例
AService := PluginsManager.ByPath('/Services/Math/Sum');
// 如果服务存在
if AService <> nil then
begin
// 创建调用参数
AResult := TQParams.Create;
Memo1.Lines.Add('调用服务 /Services/Math/Sum 计算 100+200=');
// 调用DLL中TQService接口的Execute执行函数
if AService.Execute(NewParams([, ]), AResult) then
Memo1.Lines.Add(IntToStr(AResult[].AsInteger))
else
Memo1.Lines.Add('执行失败:' + AService.LastErrorMsg);
end
else
Memo1.Lines.Add('执行失败:服务未找到');
end; // 创建
procedure TForm_Main.FormCreate(Sender: TObject);
var
AJson: TQJson;
ADelayRouter: TQDelayRouter;
APath: string;
begin
// 取文件名的路径
APath := ExtractFilePath(Application.ExeName);
AJson := TQJson.Create;
// 数组型JSON
AJson.DataType := jdtArray;
with AJson.Add() do
begin
Add('Id').AsString := GUIDToString(NewId);
Add('Path').AsString := '/Services/Math/Sum';
Add('Loader').AsString := 'Loader_DLL';
Add('Module').AsString := '插件.dll';
end;
// 保存JSON到文本
AJson.SaveToFile(APath + 'delayload.config');
// 释放JSON
FreeAndNil(AJson);
// 加载同目录DLL文件
PluginsManager.Loaders.Add(TQDLLLoader.Create(APath, '.dll'));
// 创建延迟加载服务
ADelayRouter := TQDelayRouter.Create;
ADelayRouter.ConfigFile := ExtractFilePath(Application.ExeName) + 'delayload.config';
// 添加一个子服务接口实例
PluginsManager.Routers.Add(ADelayRouter);
// 不要调用 PluginsManager.Start 以避免初始化delaydll.dll
ReportMemoryLeaksOnShutdown := True;
end; end.
DLL代码如下
unit Serv_Dll; interface uses
classes,
qstring,
QPlugins,
qplugins_base,
qplugins_params; type
TQSumService = class(TQService)
public
// 覆盖TQService接口中的Execute执行函数
function Execute(AParams, AResult: IQParams): Boolean; override;
end; implementation { TQSumService } // 覆盖TQService接口中的Execute执行函数
function TQSumService.Execute(AParams, AResult: IQParams): Boolean;
begin
// 添加一个参数,为传入的2个参数之和
AResult.Add('Result', ptInt64).AsInteger := AParams[].AsInteger + AParams[].AsInteger;
Result := True;
end; initialization // 注册
RegisterServices('Services/Math', [TQSumService.Create(NewId, 'Sum')]); finalization // 注销
UnregisterServices('Services/Math', ['Sum']); end.
011.Delphi插件之QPlugins,延时加载服务的更多相关文章
- 007.Delphi插件之QPlugins,插件的卸载和重新加载
效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...
- Image Lazy Load:那些延时加载图片的开源插件(jQuery)
图片延时加载技术对大流量的网站来说是十分实用的.目前图片在网站中大量使用,如果不加处理的话会对服务器和带宽造成级大压力,通过只渲染当前用户可见区域的图片,可以极大地减少网站的请求数,降低网络带宽资源. ...
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- js实现网页图片延时加载的原理和代码 提高网站打开速度
有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...
- 携程Android App的插件化和动态加载框架
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- JAVA的单例模式与延时加载
延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...
- MyBatis入门(五)---延时加载、缓存
一.创建数据库 1.1.建立数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.9-log : Database - mybatis ****** ...
随机推荐
- nginx 性能优化的概述及在CPU资源方面的处理
nginx的性能优化的概述 软件层面的提升硬件的使用率 增大CPU的利用率 增大内存的利用率 增大磁盘IO利用率 增大网络带宽利用率 提升硬件规格 网卡:万兆网卡.例如10G.25G.40G等 磁盘: ...
- git add 添加错文件 撤销
git status 先看一下add 中的文件 git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 git reset HEAD XXX/XXX/XXX.java ...
- Python基础-4 运算符
运算符 运算符:以1 + 2为例,1和2被称为操作数,"+" 称为运算符. Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 ...
- Go语言中的数组与数组切片
Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [in ...
- 「luogu3810」陌上花开
「luogu3810」陌上花开 传送门 三维偏序, \(\text{CDQ}\) 分治板子题. 判重的地方注意一下,别的就都是板子了. 参考代码: #include <algorithm> ...
- 设计模式课程 设计模式精讲 8-3 单例设计模式-DoubleCheck双重检查实战及原理解析
1 课程讲解 1.1 为何要使用双重检查 1.2 双重检查的缺点 1.3 指令重排序讲解 1.4 指令重排序比喻(自己理解) 1.5 如何解决指令重排序问题 2 代码演练 2.1 代码演练1(双重检查 ...
- Hadoop大实验——MapReduce的操作
日期:2019.10.30 博客期:114 星期三 实验6:Mapreduce实例——WordCount 实验说明: 1. 本次实验是第六次上机,属于验证性实验.实验报告上交截止 ...
- window查看连接过的无线密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | find ...
- 警示框UIAlertController的使用(看完马上会用!!)
本文尽量图文并茂,并且提供对应的代码,确保看到这篇文章马上能够上手使用UIAlertController控件.-我要兑现我的务实宣言- 本文构思: 1.出具效果图,通过这种最直接方式了解该控件的展示效 ...
- Docker 基础入门
Docker是一个开放的平台,将应用和基础设施分隔开来, 方便快速的交付软件.利用docker的提供的方法可以快速的测试和部署代码,显著的减少写代码和部署直接的延迟. Docker 平台(The Do ...