006.Delphi插件之QPlugins,多服务演示

演示效果如下

演示工程,全部就一个文件,代码如下

unit Frm_Main;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  System.Rtti,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,
  qstring,
  QPlugins,
  qplugins_base,
  qplugins_params,
  Vcl.ExtCtrls;

type
  TForm_Main = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    {Private declarations}
  public
    {Public declarations}
  end;

  // 继承自TQService服务
  TIntAddService = class(TQService)
  public
    function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
  end;

  // 继承自TQService服务
  TFloatAddService = class(TQService)
  public
    function Execute(AParams: IQParams; AResult: IQParams): Boolean; override; stdcall;
  end;

var
  Form_Main: TForm_Main;

implementation

{$R *.dfm}

// 判断参数类型
function IsIntType(AType: TQParamType): Boolean;
begin
  Result := AType in [ptInt8, ptInt16, ptInt32, ptInt64, ptUInt8, ptUInt16,
    ptUInt32, ptUInt64];
end;

// 判断参数类型
function IsFloatType(AType: TQParamType): Boolean;
begin
  Result := AType in [ptFloat4, ptFloat8];
end;
{TFloatAddService}

function TFloatAddService.Execute(AParams, AResult: IQParams): Boolean;
begin
  // 判断参数类型都是浮点型
  if IsFloatType(AParams[0].ParamType) and IsFloatType(AParams[1].ParamType)
  then
  begin
    // 两个参数相加
    AResult.Add(‘Result‘, ptFloat8).AsFloat := AParams[0].AsFloat +
      AParams[1].AsFloat;
    Result := True;
  end
  else
    Result := False;
end;
{TIntAddService}

function TIntAddService.Execute(AParams, AResult: IQParams): Boolean;
begin
  // 判断参数类型都是整数型
  if IsIntType(AParams[0].ParamType) and IsIntType(AParams[1].ParamType) then
  begin
    // 两个参数相加
    AResult.Add(‘Result‘, ptInt64).AsInt64 := AParams[0].AsInt64 +
      AParams[1].AsInt64;
    Result := True;
  end
  else
  begin
    Result := False;
  end;
end;

procedure TForm_Main.Button1Click(Sender: TObject);
var
  AServices:        IQServices;
  AParams, AResult: IQParams;
  procedure Calc;
  var
    I: Integer;
  begin
    // 注册2个服务,名字分别为TIntAddService和TFloatAddService
    for I := 0 to AServices.Count - 1 do
    begin
      if AServices[I].Execute(AParams, AResult) then
      begin
        Memo1.Lines.Add(‘通过服务 ‘ + AServices[I].Name + ‘ 计算完成。‘);
        Break;
      end;
    end;
  end;

begin
  // 创建2个参数
  AParams := TQParams.Create;
  AResult := TQParams.Create;
  // 调用两个整数型相加
  AServices := PluginsManager.ByPath(‘Services/Adds‘) as IQServices;
  AParams.Add(‘X‘, ptUInt8).AsInteger := 100;
  AParams.Add(‘Y‘, ptUInt8).AsInteger := 200;
  Calc;
  Memo1.Lines.Add(‘  计算表达式 100+200=‘ + IntToStr(AResult[0].AsInt64));
  AParams.Clear;
  AResult.Clear;
  // 调用两个浮点型相加
  AParams.Add(‘X‘, ptFloat8).AsFloat := 100.3;
  AParams.Add(‘Y‘, ptFloat8).AsFloat := 20.05;
  Calc;
  Memo1.Lines.Add(‘  计算表达式 100.3+20.05=‘ + FloatToStr(AResult[0].AsFloat));
end;

// 创建
procedure TForm_Main.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
  // 注册2个服务,名字分别为TIntAddService和TFloatAddService
  RegisterServices(‘/Services/Adds‘, [TIntAddService.Create(NewId, ‘AddInt‘), TFloatAddService.Create
    (NewId, ‘AddFloat‘)]);
end;

end.

原文地址:https://www.cnblogs.com/tianpan2019/p/11494914.html

时间: 2024-10-17 08:21:36

006.Delphi插件之QPlugins,多服务演示的相关文章

009.Delphi插件之QPlugins,服务的热插拔

这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, qplugins_base, QPlu

012.Delphi插件之QPlugins,多实例内嵌窗口服务

这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程序中. 界面如下 DLL代码如下: unit Frm_Dll; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Co

Delphi插件创建、调试与使用应用程序扩展

Delphi插件创建.调试与使用应用程序扩展 翻译 : MiracleZ  有没有使用过Adobe Photoshop?如果用过,你就会对插件的概念比较熟悉.对外行人来说,插件仅仅是从外部提供给应用程序的代码块而已(举个例子来说,在一个DLL中).一个插件和一个普通DLL之间的差异在于插件具有扩展父应用程序功能的能力.例如,Photoshop本身并不具备进行大量的图像处理功能.插件的加入使其获得了产生诸如模糊.斑点,以及其他所有风格的奇怪效果,而其中任何一项功能都不是父应用程序自身所具有的.对于

delphi调用 java 的 WebService服务端.

// InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioLiteral); InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioDocument); delphi调用 java 的 WebService服务端.,布布扣,bubuko.com

[原创]DELPHI木马DIY之生成服务端

文章作者:上帝的禁区信息来源:邪恶八进制信息安全团队(www.eviloctal.com)DELPHI木马DIY之生成服务端   我在这里就生成简单的服务端,为什么不先讲服务端的隐藏?因为我觉得生成服务端要好理解一点,简单一点,我们就由浅入深吧,OK,LET'S GO.   网络上其他的生成服务端的方式我不是很清楚,我就用我的方法来和大家讲解(不过还是先声明,我的方法亦是来自于网络,如果和谁的方法相同,请不要说我侵犯版权,因为我也不知道原作者是谁了,我这文章不作商业用途,如果有朋友认为我侵犯了他

C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了.      原来的写的框架只支持c#插件,这个好做,直接用c#的反射功能便可.但是公司不是所有人都搞C#,也不是所有的程序C#都能很好的完成,又或者其他公司提供的API不是C#的,这个时候,就需要这个框架能够支持多种语言了.      废话不多说,进入正题.     上网一搜,C#加载非托管的dll,无非就是使用 DllImportAttribut

Eclipse下安装SVN插件以及连接SVN服务并发布项目

Eclipse安装SVN插件 Help->Eclipse MarketPlace 查找并安装Subclipse插件 按默认步骤完成SVNEclipse插件的安装(安装完成后需要重启Eclipse后生效). 将项目从Eclipse发布到SVN服务器 新建一个Java项目: 在项目上右键,找到Team->ShareProject 选择SVN 创建一个新的资源库位置: 设置SVN地址,格式: svn://ip地址 设置SVN资源库的文件夹名称: 添加注释后选择完成: 填写SVN服务的用户名和密码 点

Delphi IOCP UDP完成端口服务端——网络高速传输数据文件系统架构

嗯,是的,标题有些那个,不过浏览器搜索出来的几乎全部是C++的,Delphi这块完全是空缺的. 不知道各位Delphi的爱好者们有没有关注腾讯这段时间的各种信息推广.涉及到各方面的行业. 不过我最佩服的是他们的实时各种网络行为,不得不说,他们的服务器确实牛逼,各种实时网络视频各种交互都是相当流畅的. 除了TCPIOCP完成端口成型之外,在这个基础上,继续调试出了UDPIOCP完成端口系统,弄这个玩意就是想做一个能够在目前这种复杂无比的网络中,能够完成游戏资源实时更新的一个高并发服务系统. 现在的

shell脚本生成服务演示服务启动、停止过程。

1.编写服务脚本/root/bin/testsrv.sh,完成如下要求 1.编写服务脚本/root/bin/testsrv.sh,完成如下要求 (1) 脚本可接受参数: start, stop, restart, status(2) 如果参数非此四者之一,提示使用格式后报错退出(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示"启动成功"考虑:如果事先已经启动过一次,该如何处理?(4) 如是stop:则删除/var/lock/subsys/