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 ...
随机推荐
- tomcat注册为windows服务
打开CMD,进入到Tomcat的bin目录,执行命令:service.bat install [service_name] 如果卸载服务,可以执行:sc delete [service_name]
- git push的时候报错: Out of memory, malloc failed (tried to allocate 82037333 bytes)
原因:上传的文件过大,这里我上传的文件有10G+所以报了上面的错误 解决方法:依次运行:git config --global pack.threads 1 git,git config --glob ...
- vim锁定,不能动
在vim中 ctrl+s是锁屏命令, ctrl+q是解锁
- Thymeleaf基本知识(推荐)
原文: http://blog.csdn.net/pdw2009/article/details/44700897 Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非We ...
- Codeforces1301C. Ayoub's function
本题的收获是,要学会反向思维,正向找包含1的太多,我们就反向找,全排列-只有0的不满足题意的就是答案,一共有n-m个0,m个1,插空法,一共有m+1个地方可以插入0序列,总排列数为(n+1)*n/2, ...
- 142、Java内部类之在普通方法里面定义内部类
01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...
- NXP TJA1040, TJA1042, TJA1050 TJA1051, TJA1057, TJA1044, TJA1055区别
历史关系 PCA82C250和PCA82C251是属于NXP第一代 CAN PHY(CAN物理层收发器): TJA1050, TJA1040和TJA1041是属于NXP第二代CAN PHY: TJA1 ...
- 7.12 Varnish体系结构
备注:应用比较小,采用的架构模式 Varnish + 基本业务功能 但是一个问题是所有的资源在一台服务器上,反向代理特别多,缓存数据特别大,导致一台机器资源不够,考虑机器的拆分 Nginx 的反向代 ...
- 图形数据写入数据库,Filletream
图形数据写入数据库 用FileStream对象读模式打开图形文件 Dim 文件对象 As New FileStream(图形文件名, FileMode.Open, FileAccess.Read) 定 ...
- 【剑指Offer面试编程题】题目1369:字符串的排列--九度OJ
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...