首页 > 其他分享 >插件框架

插件框架

时间:2024-01-25 10:55:29浏览次数:31  
标签:插件 end plugname 框架 remark PlugArray plugid

插件框架

plugin.json

{
	"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

/// <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.

  

标签:插件,end,plugname,框架,remark,PlugArray,plugid
From: https://www.cnblogs.com/hnxxcxg/p/17986695

相关文章

  • 手写web框架
    自定义web框架框架功能"""功能视图用户访问指定url获取数据库数据,并返回到页面"""wsgiref模块#01文件结构"""urls.py 路由与视图函数对应关系views.py 视图函数(后端业务逻辑)templates文件夹 专门用来存储html文件"""#按照功能的不同拆分之后......
  • gin框架路由讲解
     点击关注......
  • 【小记】MSMF 框架开发 UVC 摄像头如何正确设置 MF_MT_SUBTYPE
    简单说一下:IMFSourceReader有两个可以获取 IMFMediaType对象的接口,分别是 GetNativeMediaType与 GetCurrentMediaType。初始化时调用 GetCurrentMediaType获得的IMFMediaType对象(此时为硬件默认情况下自动选择的对象)再进行修改是不能用于SetCurrentMediaType的,即......
  • jax框架为例:求hession矩阵时前后向模式的自动求导的性能差别
    注意:本文相关基础知识不介绍。给出代码:fromjaximportjacfwd,jacrevimportjax.numpyasjnpdefhessian_1(f):returnjacfwd(jacrev(f))defhessian_2(f):returnjacfwd(jacfwd(f))defhessian_3(f):returnjacrev(jacfwd(f))defhessian_4(f):......
  • idea easyCode插件与velocity语法
    1,idea安装easyCode插件2,设置模板easyCode的教程:https://gitee.com/makejava/EasyCode/wikiseasyCode会有默认的字段类型的对应关系,也可以根据需要自己修改 下面是我自己写的一套(适用于mybatisPlus)##导入宏定义$!define##保存文件(宏定义)#save("/entity",".java")##......
  • emlog蓝叶模板伪原创插件
    一个模板如果使用的人多,搜索引擎会识别网站的相似度,会认为这是同一个站作弊行为,那就会降低你网站的权重,可能最终你的幸苦更新会成就别人,做了别人的嫁衣,所以有条件的最好是做个全新代码的模版,如果不想重新做新模板,那么emlog蓝叶模板伪原创插件可以实现你的要求,使用emlog蓝叶模板伪......
  • emlogpro蓝叶相册插件
    emlogpro蓝叶相册插件,适用于最新的emlogpro版本,后台新建专辑、上传专辑图片、修改专辑名称排序描述、设置专辑查看权限、修改图片名称,前台瀑布流模式展示相册图片列表,点击图片可以放大预览查看,响应式布局完美支持手机端。上传激活插件简单设置即可使用,简单易操作。插件下载网址:h......
  • emlog蓝叶酷我网盘插件
    emlog蓝叶酷我网盘插件,使用插件设置好用户ID即可读取调用酷我音乐网盘内的文件,酷我音乐网盘免费拥有10G容量,可上传不大于50M的文件,可上传mp3、m4a音乐文件,如需上传视频文件,可把mp4扩展名改成m4a后再上传,上传需要通过酷我音乐盒软件上传。激活emlog蓝叶酷我网盘插件后,有独立的文件......
  • emlog蓝叶移动网盘插件
    emlog蓝叶移动网盘插件,使用插件设置好移动网盘用户ID、目录ID、登陆授权码即可读取调用移动网盘指定目录里的文件,移动网盘注册简单,免费用户容量很大,支持上传大体积视频,可使用本插件读取调用音乐和视频。激活emlog蓝叶移动网盘插件后,有独立的文件列表页面,默认在发布文章页有按钮可......
  • 搞起来,使用 SpringBoot 框架徒手撸一个安全、可靠的本地缓存工具
    在实现本地缓存的时候,我们经常使用线程安全的ConcurrentHashMap来暂存数据,然后加上SpringBoot自带的@Scheduled定时刷新缓存。虽然这样可以实现本地缓存,但既不优雅也不安全。那看一下我的思路,首先看一张图!1.每个处理器都有缓存名字、描述信息、缓存初始化顺序等信息,所以应该定义一......