zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    进程锁和进程池(附线程池)
    Python多进程
    queue队列
    随笔:python3+yagmail邮件发送,简单易操作
    随笔:用python的pip命令时却显示没有提供命令:Did not provide a command
    随笔:python+selenium+unittest用qq邮箱上传文件并发送邮件
    随笔:用HtmlTestRunner生成报告
    随笔:Linux里mysql的tar包安装
    Performance Testing 前期准备以及场景设计
    Performance Testing 入门小结
  • 原文地址:https://www.cnblogs.com/tianpan2019/p/11496130.html
Copyright © 2011-2022 走看看