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 ****** ...
随机推荐
- k种球若干,取n个球,输出所有取球方案 (模拟)
有K种颜色的小球(K<=10),每种小球有若干个,总数小于100个. 现在有一个小盒子,能放N个小球(N<=8),现在要从这些小球里挑出N个小球,放满盒子. 想知道有哪些挑选方式.注:每种 ...
- FCN训练注意事项
1.如果是类别受两类,需要把标签图二值化为0,1
- Codeforces Round #580 (Div. 2)D(思维,Floyd暴力最小环)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;const int maxn=300;cons ...
- axios发送post请求[body-parser]--['Content-type': 'application/x-www-form-urlencoded']
const express = require('express') const axios = require('axios') const bodyParser = require('body-p ...
- Go语言中的数组与数组切片
Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [in ...
- Django 学习 之ORM简介与单表操作
一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...
- springboot内置的定时任务简单使用
直接上图:搞定(一定要加@EnableScheduling(开启定时任务)这个注解@Component(让spring扫描到)),下面是每五秒执行一次 结果:
- esxi虚拟机无法开机,提示“没有更多空间可供虚拟磁盘server-000001.vmdk使用。也许通过释放相关卷上的磁盘空间并单击 重试 继续此会话,单击 取消 可终止此会话”
背景:esxi安装在32G的U盘上,硬盘总大小:1.64T,虚拟机A占用:600GB,虚拟机B占用:900GB.所以还有剩余不到200G左右. 原因是宿主机硬盘空间不足.通过图中可以看出空间已经只剩2 ...
- english-phoneme
1. 声音概述 2. 音素phoneme与音标 2.1 音素与音标 2.2 音素与字母 2.3 字母发音-字母自然发音对照表 2.4 音标表 2.5 元音字母-辅音字母表 2.6 单元音发音口形趋势表 ...
- Maven:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
还是记录使用 maven 时遇到的问题. 一.maven报错 maven package 进行打包时出现了以下报错: Non-resolvable parent POM for com.wpbxin: ...