011.Delphi插件之QPlugins,延时加载服务

这个DEMO是是把DLL插件的相关信息做成了一个配置文件,主程序加载这个配置文件,从而起到延时加载的作用

主程序代码如下

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;

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

var
  Form_Main: TForm_Main;

implementation

uses
  qstring,
  qjson,
  QPlugins,
  qplugins_base,
  qplugins_loader_lib,
  qplugins_params,
  qplugins_router_delayload;
{$R *.dfm}

procedure TForm_Main.Button1Click(Sender: TObject);
var
  AService: IQService;
  AResult: IQParams;
begin
  // 通过路径获取指定的服务接口实例
  AService := PluginsManager.ByPath('/Services/Math/Sum');
  // 如果服务存在
  if AService <> nil then
  begin
    // 创建调用参数
    AResult := TQParams.Create;
    Memo1.Lines.Add('调用服务 /Services/Math/Sum 计算 100+200=');
    // 调用DLL中TQService接口的Execute执行函数
    if AService.Execute(NewParams([100, 200]), AResult) then
      Memo1.Lines.Add(IntToStr(AResult[0].AsInteger))
    else
      Memo1.Lines.Add('执行失败:' + AService.LastErrorMsg);
  end
  else
    Memo1.Lines.Add('执行失败:服务未找到');
end;

// 创建
procedure TForm_Main.FormCreate(Sender: TObject);
var
  AJson: TQJson;
  ADelayRouter: TQDelayRouter;
  APath: string;
begin
  // 取文件名的路径
  APath := ExtractFilePath(Application.ExeName);
  AJson := TQJson.Create;
  // 数组型JSON
  AJson.DataType := jdtArray;
  with AJson.Add() do
  begin
    Add('Id').AsString := GUIDToString(NewId);
    Add('Path').AsString := '/Services/Math/Sum';
    Add('Loader').AsString := 'Loader_DLL';
    Add('Module').AsString := '插件.dll';
  end;
  // 保存JSON到文本
  AJson.SaveToFile(APath + 'delayload.config');
  // 释放JSON
  FreeAndNil(AJson);
  // 加载同目录DLL文件
  PluginsManager.Loaders.Add(TQDLLLoader.Create(APath, '.dll'));
  // 创建延迟加载服务
  ADelayRouter := TQDelayRouter.Create;
  ADelayRouter.ConfigFile := ExtractFilePath(Application.ExeName) + 'delayload.config';
  // 添加一个子服务接口实例
  PluginsManager.Routers.Add(ADelayRouter);
  // 不要调用 PluginsManager.Start 以避免初始化delaydll.dll
  ReportMemoryLeaksOnShutdown := True;
end;

end.

DLL代码如下

unit Serv_Dll;

interface

uses
  classes,
  qstring,
  QPlugins,
  qplugins_base,
  qplugins_params;

type
  TQSumService = class(TQService)
  public
    // 覆盖TQService接口中的Execute执行函数
    function Execute(AParams, AResult: IQParams): Boolean; override;
  end;

implementation

{ TQSumService }

// 覆盖TQService接口中的Execute执行函数
function TQSumService.Execute(AParams, AResult: IQParams): Boolean;
begin
  // 添加一个参数,为传入的2个参数之和
  AResult.Add('Result', ptInt64).AsInteger := AParams[0].AsInteger + AParams[1].AsInteger;
  Result := True;
end;

initialization

// 注册
RegisterServices('Services/Math', [TQSumService.Create(NewId, 'Sum')]);

finalization

// 注销
UnregisterServices('Services/Math', ['Sum']);

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