• 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.
  • 相关阅读:
    rCore-Tutorial-Book-v3学习笔记(五)
    rCore-Tutorial-Book-v3学习笔记(四)
    rCore-Tutorial-Book-v3学习笔记(三)
    rCore-Tutorial-Book-v3学习笔记(二)
    rCore-Tutorial-Book-v3学习笔记(一)
    OpenStack 命令行速查表(转载)
    mysql数据库总结笔记
    Owncloud迁移上云案例
    Python
    高等数学(微积分)
  • 原文地址:https://www.cnblogs.com/tianpan2019/p/11497860.html
Copyright © 2020-2023  润新知