这个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,延时加载服务的更多相关文章

  1. 007.Delphi插件之QPlugins,插件的卸载和重新加载

    效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...

  2. 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)

    图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...

  3. Image Lazy Load:那些延时加载图片的开源插件(jQuery)

    图片延时加载技术对大流量的网站来说是十分实用的.目前图片在网站中大量使用,如果不加处理的话会对服务器和带宽造成级大压力,通过只渲染当前用户可见区域的图片,可以极大地减少网站的请求数,降低网络带宽资源. ...

  4. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  5. js实现网页图片延时加载的原理和代码 提高网站打开速度

    有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...

  6. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  7. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  8. JAVA的单例模式与延时加载

    延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...

  9. MyBatis入门(五)---延时加载、缓存

    一.创建数据库 1.1.建立数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.9-log : Database - mybatis ****** ...

随机推荐

  1. 四 Spring的工厂类,xml的配置

    Spring工厂类的结构图: BeanFactory:老版本的工厂类 BeanFactory:调用getBean的时候,才会生产类的实例 ApplicationFactory:新版本的工厂类 加载配置 ...

  2. Spring Cloud 从入门到入门

    参考:https://blog.csdn.net/hellozpc/article/details/83692496 参考:https://www.fangzhipeng.com/spring-clo ...

  3. Python环境搭建-4 pip的安装和使用

    pip的安装和使用 我们都知道python有很多的第三方库或者说是模块.这些库针对不同的应用,发挥不同的作用.我们在实际的项目中肯定会用到这些模块.那如何将这些模块导入到自己的项目中呢? Python ...

  4. Tarjan算法与割点割边

    目录 Tarjan算法与无向图的连通性 1:基础概念 2:Tarjan判断割点 3:Tarjan判断割边 Tarjan算法与无向图的连通性 1:基础概念 在说Tarjan算法求解无向图的连通性之前,先 ...

  5. Linux centos7VMware Apache和PHP结合、Apache默认虚拟主机

    一.Apache和PHP结合 httpd主配置文件/usr/local/apache2.4/conf/httpd.conf 启动报错 [root@davery ~]# /usr/local/apach ...

  6. SRS源码——UDP

    srs_app_server.cpp  int SrsServer::listen() { int ret = ERROR_SUCCESS; if ((ret = listen_rtmp()) != ...

  7. Day11 - H - Euclid's Game HDU - 1525

    Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtra ...

  8. redis5.0版本集群搭建

    模式简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令,比如:mget, 因 ...

  9. 【转载】Oracle创建数据库和用户

    以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...

  10. Day2-D-Oil Deposits-POJ-1562

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...