这个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.

最新文章

  1. jquery.fn.extend与jquery.extend--(初体验二)
  2. html、url、http、servlet&amp;jsp之间千丝万缕的联系
  3. iOS 设备标识
  4. [51nod1685]第k大区间
  5. zend studio 12汉化和破解
  6. SQL Server 数据导入Mysql详细教程
  7. 基于局部敏感哈希的协同过滤算法之simHash算法
  8. 【动态规划】Vijos P1218 数字游戏(NOIP2003普及组)
  9. [ERROR] Unknown/unsupported storage engine: InnoDB
  10. poj1860 解题报告
  11. Registry Workshop(注册表编辑器) V4.6.3 官方中文版
  12. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
  13. js函数式编程术语总结 - 持续更新
  14. Pycharm远程调试原理及配置
  15. python之django基础
  16. [原]jsbsim 自动驾驶c310ap文件改写
  17. 剑指Offer 26. 二叉搜索树与双向链表 (二叉搜索树)
  18. CSS---伪类选择器
  19. C# 发送email邮件!
  20. hadoop报错:hdfs.DFSClient: Exception in createBlockOutputStream

热门文章

  1. Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
  2. Java 8 有哪些新特性
  3. 四、linux基础-系统目录_安装_相关命令_调度
  4. 个人相关API - 行驶方向判断函数
  5. 八大排序算法C++代码实现
  6. JS简单回弹原理
  7. Python 基础之匿名函数 迭代器和高阶函数
  8. windows 创建软连接
  9. Sqlserver2012 使用sql语句增加(或删除)表一个字段
  10. Windows API 常用函数---转载