008.Delphi插件之QPlugins,服务的两种调用方法
这个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.
008.Delphi插件之QPlugins,服务的两种调用方法的更多相关文章
- linux安装mysql服务分两种安装方法:
linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...
- thinkphp的钩子的两种配置和两种调用方法
thinkphp的钩子行为类是一个比较难以理解的问题,网上有很多写thinkphp钩子类的文章,我也是根据网上的文章来设置thinkphp的钩子行为的,但根据这些网上的文章,我在设置的过程中,尝试了十 ...
- WebService两种调用方法
1.wsimport生成本地客户端代码 命令提示窗口执行生成命令. 格式:wsimport -s "src目录" -p “生成类所在包名” -keep “wsdl发布地址” 示例: ...
- MFCdll的两种调用方法
有同事问我mfcdll的掉用方法,这里总结了一下. 1 lib库调用 只要VS能找到dll对应的lib和h文件,就可以开发和调试.包含lib和h文件有两个方法. 第一种方法设置路径是 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- 在Delphi中使用C++对象(两种方法,但都要改造C++提供的DLL)
Delphi是市场上最好的RAD工具,但是现在C++占据着主导地位,有时针对一个问题很难找到Delphi或Pascal的解决方案.可是却可能找到了一个相关的C++类.本文描述几种在Delphi代码中使 ...
- Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...
- Android四大组件之服务的两种启动方式详解
Service简单概述 Service(服务):是一个没有用户界面.可以在后台长期运行且可以执行操作的应用组件.服务可由其他应用组件启动(如:Activity.另一个service).此外,组件可以绑 ...
- 两种Ajax方法
两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...
随机推荐
- python 基础之集合
集合 s=set('chen xi') s1=['cx','ee','cx'] s2=set(s1)#set为集合 print(s2,type(s2)) s=list(s2) print(s,type ...
- python 基础文件操作
实时刷新到硬盘里 f= open('hh','w',encoding='utf8') f.write('gyftyftft') f.write('hghgh\njkkjk') f.flush()#实时 ...
- day5-2正则表达式
正则表达式: 正则表达式对象的创建 1,构造函数 var pattern =new RegExp("正则表达式","修饰符") var pattern =new ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:使段落突出显示
<!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...
- 列表推导式、生成器表达式以及zip()max()max()/min()sum()sort()map()filter()的用法
列表推导式: 基本格式: variable = [out_exp_res for out_exp in input_list if out_exp == 2] #out_exp_res: 列表生成元素 ...
- [经验] Java 服务端 和 C# 客户端 实现 Socket 通信
由于项目需要, 我需要通过 Java 开发的服务端对 C# 作为脚本语言开发的 unity 项目实现控制 话不多说, 直接上代码 首先, 我们先来构建服务端的代码, 服务端我们使用 Java 语言 i ...
- 设置npm源的几种方式
设置npm源的几种方式 原始源 # the original source https://registry.npmjs.org/ 方案: 使用nrm 安装 npm install -g nrm 列出 ...
- 设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...
- 在idea中设置指向源代码(scala)
1.到官网下载scala源代码 点击如下链接下载源码:http://www.scala-lang.org/download/all.html 选择需要的版本点击进行下载,我选择的是2.11.8版本,如 ...
- SessionAttributes注解
SessionAttributes注解: a.该注解只能应用在类上: b.该注解用于将Map.ModelMap.Model或ModelAndView中的数据暂存到HttpSession中以使其可以在多 ...