这个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. ElementUI el-message 提示信息的用法

    引入message Element 注册了一个$message方法用于调用,Message 可以接收一个字符串或一个 VNode 作为参数,它会被显示为正文内容. Element 为 Vue.prot ...

  2. 你是否还在写try-catch-finally?来使用try-with-resources优雅地关闭流吧

    前言 开发中,我们常常需要在最后进行一些资源的关闭.比如读写文件流等,常见的,我们会在最后的finally里进行资源的关闭.但是这种写法是很不简洁的.其实,早在JDK1.7就已经引入了try-with ...

  3. Spring学习(三)

    DI (Dependency Injection) 1.依赖注入,组件之间的依赖关系由容器在运行期间决定.Ioc容器注入应用程序某个对象,它所需要的外部资源(包括对象,资源,常量数据). birthd ...

  4. Flex 学习笔记

    Flex布局是什么 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局 .box{ displ ...

  5. Java基础 -2.4

    字符型char类型 在任何的编程语言之中,字符都可以与int进行互相转换,也就是这个字符中所描述的内容可以通过int获取其内容所在的系统编码 public class ddd { public sta ...

  6. k短路算法

    k短路算法 求解k短路用到了A* 算法,A* ( A star )算法,又称启发式搜索算法,与之相对的,dfs与bfs都成为盲目型搜索:即为带有估价函数的优先队列BFS称为A*算法. 该算法的核心思想 ...

  7. MyuCMS_V2.1漏洞分析

    前言 在CNVD看到一个MyuCMS的一个任意文件删除漏洞.然后去搜了下这个CMS,发现官网公告显示在V2.2.3版本修复了CNVD提供的多处漏洞. 怀着好奇的心里,去CNVD搜了下这个CMS,结果发 ...

  8. 如何用python写个人专属群聊提醒小助手?

    前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...

  9. 窥探QQ基础数据库架构演变史

    作为腾讯最核心最基础的后台服务之一,QQ基础数据库是存储QQ用户帐户信息和关系链信息的海量集群,它承载了百万级每秒的访问量.十亿级的账户数.百亿级关系链.如此大规模的集群,它是如何从300万的数量级一 ...

  10. 微信小程序测试request请求webapi

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...