这个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.