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

主程序代码如下

  1. unit Frm_Main;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows,
  7. Winapi.Messages,
  8. System.SysUtils,
  9. System.Variants,
  10. System.Classes,
  11. Vcl.Graphics,
  12. Vcl.Controls,
  13. Vcl.Forms,
  14. Vcl.Dialogs,
  15. Vcl.StdCtrls;
  16.  
  17. type
  18. TForm_Main = class(TForm)
  19. Button1: TButton;
  20. Memo1: TMemo;
  21. procedure FormCreate(Sender: TObject);
  22. procedure Button1Click(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form_Main: TForm_Main;
  31.  
  32. implementation
  33.  
  34. uses
  35. qstring,
  36. qjson,
  37. QPlugins,
  38. qplugins_base,
  39. qplugins_loader_lib,
  40. qplugins_params,
  41. qplugins_router_delayload;
  42. {$R *.dfm}
  43.  
  44. procedure TForm_Main.Button1Click(Sender: TObject);
  45. var
  46. AService: IQService;
  47. AResult: IQParams;
  48. begin
  49. // 通过路径获取指定的服务接口实例
  50. AService := PluginsManager.ByPath('/Services/Math/Sum');
  51. // 如果服务存在
  52. if AService <> nil then
  53. begin
  54. // 创建调用参数
  55. AResult := TQParams.Create;
  56. Memo1.Lines.Add('调用服务 /Services/Math/Sum 计算 100+200=');
  57. // 调用DLL中TQService接口的Execute执行函数
  58. if AService.Execute(NewParams([, ]), AResult) then
  59. Memo1.Lines.Add(IntToStr(AResult[].AsInteger))
  60. else
  61. Memo1.Lines.Add('执行失败:' + AService.LastErrorMsg);
  62. end
  63. else
  64. Memo1.Lines.Add('执行失败:服务未找到');
  65. end;
  66.  
  67. // 创建
  68. procedure TForm_Main.FormCreate(Sender: TObject);
  69. var
  70. AJson: TQJson;
  71. ADelayRouter: TQDelayRouter;
  72. APath: string;
  73. begin
  74. // 取文件名的路径
  75. APath := ExtractFilePath(Application.ExeName);
  76. AJson := TQJson.Create;
  77. // 数组型JSON
  78. AJson.DataType := jdtArray;
  79. with AJson.Add() do
  80. begin
  81. Add('Id').AsString := GUIDToString(NewId);
  82. Add('Path').AsString := '/Services/Math/Sum';
  83. Add('Loader').AsString := 'Loader_DLL';
  84. Add('Module').AsString := '插件.dll';
  85. end;
  86. // 保存JSON到文本
  87. AJson.SaveToFile(APath + 'delayload.config');
  88. // 释放JSON
  89. FreeAndNil(AJson);
  90. // 加载同目录DLL文件
  91. PluginsManager.Loaders.Add(TQDLLLoader.Create(APath, '.dll'));
  92. // 创建延迟加载服务
  93. ADelayRouter := TQDelayRouter.Create;
  94. ADelayRouter.ConfigFile := ExtractFilePath(Application.ExeName) + 'delayload.config';
  95. // 添加一个子服务接口实例
  96. PluginsManager.Routers.Add(ADelayRouter);
  97. // 不要调用 PluginsManager.Start 以避免初始化delaydll.dll
  98. ReportMemoryLeaksOnShutdown := True;
  99. end;
  100.  
  101. end.

DLL代码如下

  1. unit Serv_Dll;
  2.  
  3. interface
  4.  
  5. uses
  6. classes,
  7. qstring,
  8. QPlugins,
  9. qplugins_base,
  10. qplugins_params;
  11.  
  12. type
  13. TQSumService = class(TQService)
  14. public
  15. // 覆盖TQService接口中的Execute执行函数
  16. function Execute(AParams, AResult: IQParams): Boolean; override;
  17. end;
  18.  
  19. implementation
  20.  
  21. { TQSumService }
  22.  
  23. // 覆盖TQService接口中的Execute执行函数
  24. function TQSumService.Execute(AParams, AResult: IQParams): Boolean;
  25. begin
  26. // 添加一个参数,为传入的2个参数之和
  27. AResult.Add('Result', ptInt64).AsInteger := AParams[].AsInteger + AParams[].AsInteger;
  28. Result := True;
  29. end;
  30.  
  31. initialization
  32.  
  33. // 注册
  34. RegisterServices('Services/Math', [TQSumService.Create(NewId, 'Sum')]);
  35.  
  36. finalization
  37.  
  38. // 注销
  39. UnregisterServices('Services/Math', ['Sum']);
  40.  
  41. 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. Ubuntu将Python3软连接到Python

    sudo ln -s /usr/bin/python3 /usr/bin/python

  2. teraterm中状态框statusbox

    ;Author : Bing ;Date : 1/17/2019;Usage: modify log drictory according to actual drictorylogfile=&quo ...

  3. 去重sort|uniq -d

    #!/bin/bash ############################################################### #Author :Bing # #Create ...

  4. tensorflow中的图(02-1)

    由于tensorflow版本迭代较快且不同版本的接口会有差距,我这里使用的是1.14.0的版本 安装指定版本的方法:pip install tensorflow==1.14.0      如果你之前安 ...

  5. springboot 重写 AuthorizationFilter

    原文链接:https://www.cnblogs.com/zeussbook/p/10778532.html

  6. Linux 7 和 CentOS 7 收到重要内核安全更新

    导读 Red Hat 和 CentOS 宣布了其 Red Hat Enterprise Linux 7 和 CentOS Linux 7 操作系统系列重要内核安全更新的可用性. 据悉,这些更新解决了两 ...

  7. iOS 批量上传图片的 3 种方法

    AFNetworking 在去年年底升级到了 3.0.这个版本更新想必有很多好处,然而让我吃惊的是,它并没有 batch request 接口.之前的 1.x 版本.2.x 版本都实现了这个很常见的需 ...

  8. php实现简单链式操作mysql数据库类

    <?php $dbConfig = require_once(dirname(__FILE__).'/config.php'); class Db{     public $conn;      ...

  9. Py西游攻关之基础数据类型(二)-列表

    Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html  五 List(列表) OK,现在我们知 ...

  10. 那些年我们踩过的坑,SQL 中的空值陷阱!

    文章目录 NULL 即是空 三值逻辑 空值比较 NOT IN 与空值 函数与空值 DISTINCT.GROUP BY.UNION 与空值 ORDER BY 与空值 空值处理函数 字段约束与空值 SQL ...