010.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,
QPlugins,
QPlugins_base,
QPlugins_Params,
QPlugins_Loader_Lib; type
TForm_Main = class(TForm)
edtPluginsFile: TEdit;
Label1: TLabel;
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure EnumFileServices(const AFileName: String);
public
{ Public declarations }
end; var
Form_Main: TForm_Main; implementation {$R *.dfm} procedure TForm_Main.Button1Click(Sender: TObject);
var
AExt: String;
ALoader: IQLoader;
begin
// 打开对话框加载DLL
if OpenDialog1.Execute then
begin
// 根据路径的后缀名来判断是加载DLL还是BPL
AExt := UpperCase(ExtractFileExt(OpenDialog1.FileName));
if AExt = '.DLL' then
begin
// 通过路径获取指定的服务接口实例
ALoader := PluginsManager.ByPath('/Loaders/Loader_DLL') as IQLoader;
// 创建一个插件加载器
if not Assigned(ALoader) then
begin
ALoader := TQDLLLoader.Create('', '.dll');
PluginsManager.Loaders.Add(ALoader);
end;
end
else // BPL
begin
ALoader := PluginsManager.ByPath('/Loaders/Loader_BPL') as IQLoader;
if not Assigned(ALoader) then
begin
ALoader := TQBPLLoader.Create('', '.bpl');
PluginsManager.Loaders.Add(ALoader);
end;
end;
// 加载指定文件名的插件提供的所有服务
ALoader.LoadServices(PWideChar(OpenDialog1.FileName));
// 把路径显示在编辑框中
edtPluginsFile.Text := OpenDialog1.FileName;
// 遍历这个文件的服务
EnumFileServices(OpenDialog1.FileName);
end;
end; // 遍历这个文件拥有的所有服务接口
procedure TForm_Main.EnumFileServices(const AFileName: String);
var
AInst: HINST;
// 遍历服务
procedure EnumServices(AService: IQService);
var
AList: IQServices;
I: Integer;
begin
// IQServices: 服务列表接口
// IQService: 普通服务接口 // 判断是IQServices还是IQService,如果是IQServices就进去遍历
if Supports(AService, IQServices, AList) then
begin
for I := to AList.Count - do
begin
EnumServices(AList.Items[I]);
end;
end
else // 如果是IQService就输出
begin
// 获取服务提供者模块句柄
if AService.GetOwnerInstance = AInst then
begin
// 输出
Memo1.Lines.Add(ServicePath(AService));
end;
end;
end; begin
// GetModuleHandle获取一个模块(dll)的句柄
AInst := GetModuleHandle(PChar(AFileName));
// 输出模块地址
Memo1.Lines.Add(AFileName + ' 注册的服务(基址:' + IntToHex(AInst, ) + ')');
// 遍历所拥有的服务
EnumServices(PluginsManager as IQService);
end; end.
010.Delphi插件之QPlugins,遍历服务接口的更多相关文章
- 009.Delphi插件之QPlugins,服务的热插拔
这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, ...
- 008.Delphi插件之QPlugins,服务的两种调用方法
这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类.点击不同的按钮,使用不同的方法来调用这个服务. 效果界面如下 unit Frm_Main; inte ...
- 011.Delphi插件之QPlugins,延时加载服务
这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...
- 013.Delphi插件之QPlugins,模块化代码示例
这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...
- 004.Delphi插件之QPlugins,参数传递
界面如下 插件框架中大量使用了接口的东西,看的眼花缭乱,很多地方只做了申明,具体的实现是在另外的子类. DLL的代码如下 unit ParamTest; interface uses classes, ...
- 007.Delphi插件之QPlugins,插件的卸载和重新加载
效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...
- 002.Delphi插件之QPlugins,菜单插件
运行之后的效果如下, 图一 图二 主界面代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...
- 012.Delphi插件之QPlugins,多实例内嵌窗口服务
这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...
- 006.Delphi插件之QPlugins,多服务演示
演示效果如下 演示工程,全部就一个文件,代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...
随机推荐
- selenium webdriver 相关网站
ITeye:http://shijincheng0223.iteye.com/blog/1481446 http://ztreeapi.iteye.com/blog/1750554 http://sm ...
- OBST(最优二叉搜索树)
简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...
- Codeforces1303C. Perfect Keyboard
本题可以转换成图论来做,每两个相邻点连一条边,然后统计每一个点的degree,如果>=2说明有一个点要相邻三个点,不满足题意,然后找出每个degree<2的点,这些点可以作为一段的起点,然 ...
- 「JLOI2011」飞行路线
前言 看到好多大佬都在跑分层图最短路,\(\text{DP}\) 解法的我瑟瑟发抖... 题目描述 给定一张 \(N\) 个点(点编号从 \(0\) 到 \(N-1\)),\(M\) 条边的无向带权图 ...
- .Net使用SharpZip解压缩文件
最近,项目中使用到了上传压缩文件,文件上传到服务器后,肯定要解压,取出其中的文件才能使用,在这里做一个小结,Get这个新技能. 首先在使用NuGet管理程序在项目中添加引用ICSharpCode.Sh ...
- CSS - 插入图片img和背景图片
1. img插入图片,用的最多,比如产品展示类 .section img { width: 200px;/* 插入图片更改大小 width 和 height */ height: 210px; mar ...
- python 网络爬虫(一)
一.识别网站所用技术 构建网站所使用的技术类型也会对我们如何爬取产生影响.有一个十分有用的工具可以检查网站构建的技术类型---builtwith模块.该模块的安装如下 pip install buil ...
- 2 HTML简介&标签嵌套和并列关系&文档声明
HTML:Hyper Text Markup Language 超文本标签语言(hyper:精力旺盛的 markup:标记 n noun) HTML不是编程语言,而是一种标记语言(就是一套标记标签) ...
- 网络协议-restful协议
REST Representational State Transfer, 是一种软件架构风格,提供一系列限制指导,用于更好的创建web service. 符合REST 架构风格的web servic ...
- 从POST和GET和request过滤掉SQL注入
替换掉sql关键字,进行处理 // sql参数过滤 function sqlCheck($paramater){ $arr = array(); foreach($paramater as $k=&g ...