008.Delphi插件之QPlugins,服务的两种调用方法
2024-10-08 14:58:55
这个QPlugins自带的DEMO,大概的意思就是,创建2个服务类,程序启动的时候注册这2个服务类。点击不同的按钮,使用不同的方法来调用这个服务。
效果界面如下
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_params,
qplugins_base; type
TForm_Main = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; // 定义一个接口,子类中实现接口方法
IQMyServiceExt = interface
['{46DD594D-0A3D-49E6-BE86-61E653EB3589}']
procedure SayHello(AStr: string);
end; // 服务扩展的实例
TQMyServiceExt = class(TQInterfacedObject, IQMyServiceExt)
private
// 接口中Sayhello方法的实现
procedure SayHello(AStr: string = '');
public
constructor Create; override;
end; // IQMultiInstanceExtension 服务扩展多实例接口
TQMyMultiInstanceExt = class(TQMyServiceExt, IQMultiInstanceExtension)
protected
function GetInstance(var AResult: IInterface): Boolean; stdcall;
end; var
Form_Main: TForm_Main; implementation uses
qstring;
{$R *.dfm}
{ TQMyServiceExt } // 创建
constructor TQMyServiceExt.Create;
begin
// 调用祖先类的Create函数
inherited;
end; // 接口中Sayhello方法的实现
procedure TQMyServiceExt.SayHello(AStr: string);
begin
// 输出
if AStr <> '' then
begin
Form_Main.Memo1.Lines.Add(AStr);
end;
Form_Main.Memo1.Lines.Add('扩展接口类名为:' + ClassName);
end; // 创建
procedure TForm_Main.FormCreate(Sender: TObject);
var
AService: TQService;
AExt: IQMyServiceExt;
begin
// 注册TQMyServiceExt服务
AService := TQService.Create(NewId, 'Message');
AService.AddExtension(TQMyServiceExt.Create);
RegisterServices('Services', [AService]); // 注册TQMyMultiInstanceExt服务
AService := TQService.Create(NewId, 'MultiIntance');
AExt := TQMyMultiInstanceExt.Create;
AService.AddExtension(AExt);
RegisterServices('Services', [AService]);
end; { TQMyMultiInstanceExt } // 取服务扩展的实例
function TQMyMultiInstanceExt.GetInstance(var AResult: IInterface): Boolean;
begin
AResult := TQMyServiceExt.Create;
Result := true;
end; // 按钮_直接调接口
procedure TForm_Main.Button2Click(Sender: TObject);
begin
(PluginsManager as IQMyServiceExt).SayHello('');
end; // 按钮_按路径调接口
procedure TForm_Main.Button1Click(Sender: TObject);
var
AService: IQService;
begin
AService := GetService('/Services/Message');
(AService as IQMyServiceExt).SayHello('');
end; // 按钮_多实例扩展
procedure TForm_Main.Button3Click(Sender: TObject);
var
AService: IQService;
AExt: IQMyServiceExt;
begin
// 获取指定路径的服务实例
AService := GetService('/Services/MultiIntance');
AExt := AService as IQMyServiceExt;
AExt.SayHello(Format('接口实例地址:%X', [IntPtr(AExt)]));
end; end.
最新文章
- jquery.fn.extend与jquery.extend--(初体验二)
- html、url、http、servlet&;jsp之间千丝万缕的联系
- iOS 设备标识
- [51nod1685]第k大区间
- zend studio 12汉化和破解
- SQL Server 数据导入Mysql详细教程
- 基于局部敏感哈希的协同过滤算法之simHash算法
- 【动态规划】Vijos P1218 数字游戏(NOIP2003普及组)
- [ERROR] Unknown/unsupported storage engine: InnoDB
- poj1860 解题报告
- Registry Workshop(注册表编辑器) V4.6.3 官方中文版
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
- js函数式编程术语总结 - 持续更新
- Pycharm远程调试原理及配置
- python之django基础
- [原]jsbsim 自动驾驶c310ap文件改写
- 剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)
- CSS---伪类选择器
- C# 发送email邮件!
- hadoop报错:hdfs.DFSClient: Exception in createBlockOutputStream
热门文章
- Vue——解决报错 Computed property ";****"; was assigned to but it has no setter.
- Java 8 有哪些新特性
- 四、linux基础-系统目录_安装_相关命令_调度
- 个人相关API - 行驶方向判断函数
- 八大排序算法C++代码实现
- JS简单回弹原理
- Python 基础之匿名函数 迭代器和高阶函数
- windows 创建软连接
- Sqlserver2012 使用sql语句增加(或删除)表一个字段
- Windows API 常用函数---转载