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 ****** ...
随机推荐
- Eclipse创建一个普通的java web项目
1.右键new ,选web project ,下一步 2.为项目命名,然后finish 3.然后将jar包复制到lib目录下, 4.就会自动将jar包编译到web app Libraries,项目创建 ...
- 吴裕雄--天生自然TensorFlow2教程:输出方式
sigmoid out' = sigmoid(out) # 把输出值压缩在0-1 import tensorflow as tf a = tf.linspace(-6., 6, 10) a tf.si ...
- 3_03_MSSQL课程_Ado.Net_登录复习和ExcuteScalar
SQL注入 ->登陆窗体破解 ->配置文件 ->首先在 app.Config文件中添加 节点,如下: <connectionStrings> <add name=& ...
- Vue - 监听页面刷新和关闭
一,在 created中 注册 页面刷新和关闭事件 created() { window.addEventListener('beforeunload', e => this.test(e)) ...
- 32 commons-lang包学习
maven依赖 <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lan ...
- python神器-pycharm安装与使用(全网最新)
pycharm分为社区版(免费)和专业版(收费/破解),以下安装仅适用于社区版 下载方式1: 官网下载:https://www.jetbrains.com/pycharm/download/dow ...
- java打包成可执行的jar或者exe的详细步骤
Java程序完成以后,对于Windows操作系统,习惯总是想双击某个exe文件就可以直接运行程序,现我将一步一步的实现该过程.最终结果是:不用安装JRE环境,不用安装数据库,直接双击一个exe文件,就 ...
- python对ASC码的加减
一般使用这两个函数 sum = ord('A') //结果为65 ord()函数返回值是int 字符要加' '否则会当作变量来看 sum = chr(65) //结果为A 不是char是chr()
- 利用Python进行多项式拟合
多项式拟合的简单代码: import matplotlib.pyplot as plt import numpy as np x=[,,,,,,,] y=[,,,,,,,] a=np.polyfit( ...
- Python学习第八课——函数
python函数(def) def test(x): # x为形参 y = x + 20 return y # def:定义函数的关键字 # test:函数名 # ():内定义参数 # x+=1:代码 ...