这个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. Android开发:界面设计之六大layouts介绍

    1.帧布局 FrameLayout: FrameLayout是最简单的布局对象.在它里面的的所有显示对象都将固定在屏幕的左上角,不能指定位置,后一个会直接覆盖在前一个之上显示 因为上面的一段话这个是在 ...

  2. springboot RESTful Web Service

    参考:http://spring.io/guides/gs/rest-service-cors/

  3. 如何用C++读取图片中的像素

    来源:https://bbs.csdn.net/topics/391956973  3楼 #include <iostream> #include <fstream> #inc ...

  4. WCF服务调用方式

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用.

  5. Windows 控制台命令笔记

    1. cmd中输出中文乱码问题: CHCP是一个计算机指令,能够显示或设置活动代码页编号. C:\windows\system32>CHCP 活动代码页: 936 原因是我们使用了GBK编码,下 ...

  6. jstl.jar下载

    jakarta开源java项目 http://attic.apache.org/projects/jakarta.html 根据其官网信息项目已于2011年退休. 不过上面官方链接可以点击Downlo ...

  7. 用Java打开一个网页

    BareBonesBrowserLaunch.java 从网上无意间看到的一个工具类,意思是打开一个URL,在不同的操作系统都通用. 1.使用 很简单: String url = "http ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:让按钮看起来像个链接 (仍然保留按钮行为)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错

    问题:mysql设置timpstamp的默认值为 '0000-00-00 00:00:00' 时报错: ERROR 1067 (42000): Invalid default value for 'u ...

  10. bzoj 4747: [Usaco2016 Dec]Counting Haybales

    23333,在扒了一天题解之后发现我竟然还能秒题,虽然这是个pj的sb题... (排个序,然后upper_bound和lower_bound一用就行了(是不是有O(1)的查询方法啊??貌似要离散啊,一 ...