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 ...
随机推荐
- 笔记-pymysq-exception
笔记-pymysq-exception 1. exception DB API中定义了一些数据库操作的错误及异常,下表列出了这些错误和异常: 基本上是继承了Exception基类,没有添加额外功能. ...
- C程序的执行和当前进程的结束
内核使程序执行的唯一方法,就是调用exec函数,这个函数又会启动一个C程序启动例程,这个启动例程是C程序的启动地址.负责调用main函数,并接受mainn函数的返回值. 使得进程结束的唯一方式是隐式的 ...
- Python组合类型笔记
Python中常用的三种组合数据类型,分别是: - 集合类型 - 序列类型 - 字典类型 1. 集合类型: -集合用大括号{}表示,元素间用逗号分隔 -建立集合类型用{}或set() -建立空集合类型 ...
- 02-05Android学习进度报告五
今天主要学习了关于Android 开发的关于进度条和拖动条的知识. 主要学习了一些关于进度条的基本属性: android:max:进度条的最大值 android:progress:进度条已完成进度值 ...
- 学习笔记(16)- InsuranceQA_zh
仓库地址:https://github.com/l11x0m7/InsuranceQA_zh Convolutional Neural Network for Chinese InsuranceQA ...
- Spring 各个组件架构
- SELinux永久关闭
目录 SELinux永久关闭 参考 SELinux三种模式 永久关闭方法 SELinux永久关闭
- Python入门之元组
一.什么是元祖 元祖是不可变类型(列表是可变类型) 为什么要设计元祖这样不可变类型?因为一旦创建了不可变类型的对象,对象内部的所有数据就不能被修改了,这样避免了 由于修改数据导致的错误.此外,对于不可 ...
- Shenandoah 与 ZGC
简介 Shenandoah GC 与 ZGC 同为新一代的低延迟收集器, 分别由RedHat和Oracle开发, 目前还在实验阶段, 尚未使用于生产环境. GC的三项指标: Footprint(内存占 ...
- 灵光一闪来个科普贴:Linux文件系统
在计算机系统中,各种需要保存的信息都是以文件的形式存在的.文件管理是对系统信息资源的管理,是操作系统的一项重要功能. 1.文件与文件系统: 1.1文件: 文件是具有名字的一组相关信息的有序集合,存放在 ...