这个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是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技 ...
随机推荐
-
修改oracle占用的8080端口
Oracle10g在安装完成后,默认占用8080端口,而这个端口也是Tomcat 的默认端口.如果想改Oracle的默认8080端口的话可以这么做: 步骤一:运行cmd,输入sqlplus / as ...
-
sqlite学习1
Architecture  就像编译器一样,结构分为前端.虚拟机.后端 性能和限制(limitations) 使用B树来做indexes,用B+树来做table.和其他数据库一样 由于不需要鉴权.网 ...
-
oracle10g在rh6上安装缺少libXtst*的包导致不能出OUI
由于测试需要,今天在linux6.0上装了下oracle10g,确实是知道oracle10g已经不支持redhat5.0以后的版本了,但是根据自己以往在redhat5.0上装oracle的经验就鲁莽下 ...
-
【JavaScript】日期和数字格式化
var date, number; /** * 让日期和时间按照指定的格式显示的方法 * @param date * @param formatString format 格式字符串 * @retur ...
-
Spark on Yarn遇到的问题及解决思路
原文:http://www.aboutyun.com/thread-9425-1-1.html 问题导读1.Connection Refused可能原因是什么?2.如何判断内存溢出,该如何解决?扩展: ...
-
Java对Excel表格的操作
import java.io.File;//引入类import java.io.IOException;import java.util.Scanner;import jxl.Cell;import ...
-
BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
-
gets、scanf和getchar之间的区别
gets gets.scanf和getchar之间的区别 1. gets函数读取数据时,接受的数据包括数据和回车符.即:读取数据后输入流没有输入 操作动作. 2. scanf函数读取数据时,接受的数据 ...
-
kali系统安装
kali live 安装到U盘 http://www.backtrack.org.cn/thread-17197-1-1.html 用Live U盘安装Kali Linux http://cn.doc ...
-
Modelsim使用常见问题集锦(实时更新)
1.Modelsim使用时出现闪退情况,解决办法:(1)请再次查看modelsim是否破解完全:(2)电脑上安装的文件与Modelsim有冲突,多半是爱奇艺这个软件,删掉爱奇艺软件. 2.再利用mod ...