插件框架

插件框架

plugin.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
    "plugin":
    [
        {
            "plugid":1000,
            "plugname":"bpl1.bpl",
            "remark":"REST CRUD"
        },
        {
            "plugid":1001,
            "plugname":"bpl2.bpl",
            "remark":"REST文件传输"
        },
        {
            "plugid":2000,
            "plugname":"bpl3.bpl",
            "remark":"binary CRUD"
        },
        {
            "plugid":2001,
            "plugname":"bpl4.bpl",
            "remark":"binary文件传输"
        },
        {
            "plugid":3000,
            "plugname":"bpl5.bpl",
            "remark":"binary雪花ID"
        }
    ]
}

  plugin.manager.pas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/// <author>cxg 2024-1-25</author>
/// 包扩展名,windows是.bpl;LINUX是.so
 
unit plugin.manager;
 
interface
 
uses
  System.Rtti, global, System.Classes, yn.log, System.SysUtils,
  system.JSON, json.help;
 
type
  TPlug = record  //插件信息记录
    plugid, plughandle: Integer;
    plugname, remark: string;
  end;
 
type
  TPlugs = array of TPlug;  //插件信息记录数组
 
procedure LoadPlugs;  /// 加载所有的插件
function GetPlug(plugid: Integer): TPlug;   /// 获取一个插件信息记录
 
var
  PlugArray: TPlugs;
  PlugNames: TStringList;   //已加载的包
 
implementation
 
function GetPlug(plugid: Integer): TPlug;
begin
  var p: TPlug;
  for p in PlugArray do
    if p.plugid = plugid then
    begin
      Result := p;
      Exit;
    end;
end;
 
function ExistsPlug(Plugname: string): Boolean;
begin
  Result := PlugNames.IndexOf(Plugname) <> -1
end;
 
procedure LoadPlugs;
begin
  var jo: TJSONObject:= TJSONObject.Create;
  jo.LoadFromFile(PlugCfg);
  try
    try
      var plugname: string;
      var ja: TJSONArray := jo.A['plugin'];
      SetLength(PlugArray, ja.Count);   // 设置插件数组 下标
      for var i: integer := 0 to ja.Count - 1 do
      begin
        var o: TJSONObject := ja.Items[i] as TJSONObject;
        plugname := o.S['plugname'];
        PlugArray[i].plugid := o.I['plugid'];
        PlugArray[i].plugname := plugname;
        PlugArray[i].remark := o.S['remark'];
        if not ExistsPlug(plugname) then     //不重复加载.bpl or .so
        begin
          var h: Cardinal := LoadPackage(PlugPath + PlugArray[i].plugname);  //加载插件
          PlugArray[i].plughandle := h;
          var s: string;
          if h = 0 then
          begin
            s := 'Load ' + PlugArray[i].plugname + ' fail.';
            Writeln(s);
          end
          else
          begin
            PlugNames.Add(plugname);
            s := 'Load ' + PlugArray[i].plugname + '(' + PlugArray[i].remark +')';
            Writeln(s);
          end;
          WriteLog(s);
        end;
      end;
    except
      on E: Exception do
        WriteLog('plugin.manager.LoadPlugs()' + E.Message);
    end;
  finally
    jo.Free;
  end;
end;
 
initialization
  PlugNames := TStringList.Create;
 
finalization
  FreeAndNil(PlugNames);
 
end.

  

posted @   delphi中间件  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示