这个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,遍历服务接口的更多相关文章

  1. 009.Delphi插件之QPlugins,服务的热插拔

    这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, ...

  2. 008.Delphi插件之QPlugins,服务的两种调用方法

    这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类.点击不同的按钮,使用不同的方法来调用这个服务. 效果界面如下 unit Frm_Main; inte ...

  3. 011.Delphi插件之QPlugins,延时加载服务

    这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用 主程序代码如下 unit Frm_Main; interface uses Winapi.Wi ...

  4. 013.Delphi插件之QPlugins,模块化代码示例

    这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...

  5. 004.Delphi插件之QPlugins,参数传递

    界面如下 插件框架中大量使用了接口的东西,看的眼花缭乱,很多地方只做了申明,具体的实现是在另外的子类. DLL的代码如下 unit ParamTest; interface uses classes, ...

  6. 007.Delphi插件之QPlugins,插件的卸载和重新加载

    效果图如下,可以反复卸载和重新加载.QPlugins这个插件,还没弄明白,摸索着跟着DEMO写 主窗口代码如下 unit Frm_Main; interface uses Winapi.Windows ...

  7. 002.Delphi插件之QPlugins,菜单插件

    运行之后的效果如下, 图一 图二 主界面代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...

  8. 012.Delphi插件之QPlugins,多实例内嵌窗口服务

    这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...

  9. 006.Delphi插件之QPlugins,多服务演示

    演示效果如下 演示工程,全部就一个文件,代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUt ...

随机推荐

  1. 十三 Spring的通知类型,切入表达式写法

    Spring中通知类型: 前置通知:目标方法执行之前进行操作,可以获得切入点信息 后置通知: 目标方法执行之后进行操作,可以获得方法的返回值 环绕通知:在目标方法执行之前和之后进行操作,可以终止目标方 ...

  2. 模拟服务容器Ioc

    服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 一个类要被容器所能够提取,必须要先注册至这个容器.既然称这个容器叫做服务容器,那么我们需要某个服务,就得先注册.绑定这个服务到容器,那么提供服务 ...

  3. 重识线段树——Let's start with the start.

    声明 本文为 Clouder 原创,在未经许可情况下请不要随意转载.原文链接 前言 一般地,这篇文章是给学习过线段树却仍不透彻者撰写的,因此在某些简单的操作上可能会一笔带过. 当然了,入门线段树后也可 ...

  4. unittest---unittest数据驱动(ddt)

    在做测试的时候,有些地方无论是接口还是UI只是参数数据的输入不一样,操作过程是一样的.重复去写操作过程会增加代码量,我们可以通过参数化的方式解决这个问题,也叫做数据驱动,我们通过python做参数化的 ...

  5. 算法设计与分析 - 李春葆 - 第二版 - pdf->word v1

    章─概论 练习题 . 下列关于算法的说法中正确的有( ).Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产 ...

  6. iis下发布MVC网站

    1.首先检查有没有安装iis,没有的话先安装iis 2. 3.选择应用程序池的时候看有没有asp.net 4.0 如果没有先安装. 首先以管理员身份打开“运行”输入cd C:\Windows\Micr ...

  7. zabbix server 安装部署

    一:安装zabbix服务端 1.部署准备 命令:iptables -F     #关闭防火墙命令:systemctl stop firewalld    #关闭防火墙 设置解析,自建yum源 命令:c ...

  8. MySQL操作之DML

    目录 SQL语句的分类 DML语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...

  9. 网站seo优化教你如何引蜘蛛爬行网站

    1. 网站和页面的权重 这个是咱们都知道的,网站和页面的权重越高的话,蜘蛛一般会匍匐的越深,被蜘蛛录入的页面也更多一些.可是一个新的网站,权重到达1的话是相对简单的,可是假如想要把权重再网上添加则会越 ...

  10. BUAA软工第一次作业-热身

    第一次作业-热身 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) (北京航空航天大学 - 计算机学院) 这个作业的要求在哪里 第一次作业-热身作业(阅读) 我在这个课程 ...