随笔分类 - 插件框架
插件框架的完整实现
摘要:咏南跨平台中间件支持WEBSERVICE插件
阅读全文
摘要:咏南中间件支持WEBSERVICE插件
阅读全文
摘要:咏南中间件新增MORMOT插件功能
阅读全文
摘要:菜单树 // add by cxg 2017-4-18 unit uTree; interface uses SysUtils, Classes, ComCtrls, DB, DBClient; type PNodeRec = ^TNodeRec; TNodeRec = record // 树节点记
阅读全文
摘要:咏南中间件支持服务端热插拔业务插件,中间件不需要停机即可增加和修改业务插件。
阅读全文
摘要:咏南CS插件开发框架同时支持2层和3层开发了,是的一套代码既支持2层也能3层开发。 你要做的仅仅是在配置文件里面设置一个2层还是3层的开关控制一下。 对,就这么简单!
阅读全文
摘要:BPL就是一种DLL,DLL的EXPORTS和GETPROCADDRESS()在BPL中一样好使。要调用BPL中的方法也和调用DLL的一样。代码略。
阅读全文
摘要:1)非RTTI方式适用于所有的DELPHI版本unit untMain;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Buttons;type...
阅读全文
摘要:登录主界面及自动升级物料档案物料类别标准菜谱采购订单入库单前台收银
阅读全文
摘要:鄙人乃码农,不善辞藻,遂采用一问一答式,试图解开插件架构之谜雾。此次只讲原理不上码。什么叫插件?此处不作解释。插件的分类?插件粗分为可视插件和非可视插件。插件的存在形态?插件最终静静地持久在磁盘的某个文件中。在DELPHI中插件以.dll和.bpl俩种扩展名的文件存在。插件的加载和释放?插件既有生(加载)亦有死(释放)。bpl插件和dll插件的加载和释放都有所不同,要具体对待。如何判断是哪一种插件?通过判断插件文件的扩展名可以知道是哪一种插件。在DELPHI中插件的扩展名不是就是。插件框架的组成?由一个插件的加载程序和N个插件组成。它们都是单独的工程,这些工程们组成一个庞大的工程组。插件的加载
阅读全文
摘要:unit main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Menus, ExtCtrls, RemoteMethod ,DBClient, DB;type PNode = ^TNode; TNode = record id: string; cn: string; tw: string; en: string; dll: string; classname: WideString; dsc: string; pid:.
阅读全文
摘要:主控程序(通常是EXE程序),各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。1. 主控程序和各插件工程中,BUILD WITH RUNTIME PACKAGE都勾选上。整个程序运行的时候,保障了所有的VCL对象只有唯一的一份,杜绝了VCL对象相互之间发生冲突的可能性。此种方式最为稳定和安全,建议使用此方式。但此种方式有一个缺点:发布程序的时候,DELPHI RTL包,第三方控件的BPL运行时包要一起打包发布,否则程序将不能运行。此种方式编译出来的EXE/DLL/BPL一般体积会比较小,往往只有几百K,因为运行时包没有编译进来。2. 主控程序和各插件工程中,BUILD WIT
阅读全文
摘要:一个插件就是一个DLL或者BPL工程,只有经过注册的插件和注册的插件中的模块,主控程序才能识别并加载。1. 注册插件的数据表结构:如上图所示需要在数据表中登记插件的名称(比如PLUGIN1.DLL)和插件的说明(比如基本资料)。2. 注册插件中的模块的数据表结构:如上图所示需要在数据表中登记模块的编号,所属的父模块编号,模块的名称,所属插件的名称,模块的类名,说明
阅读全文
摘要:只有使用REGISTERCLASS()方法注册了的类,才能使用FINDCLASS(className)方法查找然后创建类的实例对象。在每个单元的初始化节注册类。initialization RegisterClass(TDicForm);finalization UnRegisterClass(TDicForm);end.
阅读全文
摘要:基类窗体要实现的需求包括:控件窗体的字体,权限控制,控制子窗体的显示范围,以及其它一些通用方法的声明。。。。。。通用方法可声明为VIRTUAL方法,以允许从它继承的子窗体可以OVERRIDE这些方法,达到多态的效果。unit uBaseForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;type TBaseForm = class(TForm) procedure FormClose(Sender: TObject; var Action: T
阅读全文
摘要:在插件中需要对接口中的方法进行具体的实现,主控程序才能调用并执行插件中的具体功能。unit uPlug;interfaceuses uInterface, Forms, Windows, Classes, SysUtils;type TModelService = class(TInterfacedObject, IModelInts) private function CheckFormExists(aClassName: pchar): Boolean; public procedure Cmd(aClassName: PChar); // create visual plugin pro
阅读全文
摘要:使用TRzMenuController控件只是为了增加主菜单的皮肤效果,可清除此控件主控程序的主窗口单元要实现的需求如下:1.自动识别并加载各个已经注册的插件;2.自动识别并加载各个已经注册的插件中的各个模块(自动生成系统的主菜单,自动生成各菜单项的点击事件);unit uMainForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Menus, Loader, Buttons, uInterface,
阅读全文
摘要:主控程序和各插件之间通过预约的接口进行交互,这就是为什么主控程序能够自动识别插件的原因,因为主控程序和各插件早已经预约了接口。主控程序调用插件中的导出函数,取得导出函数的返回值,这个返回值返回的是某一个接口。一个导出函数的返回值可以返回一个接口,多个导出函数就可以返回多个接口。接口里面定义了许多的方法,通过接口可以调用到它里面的某一个方法,即调用了插件里面的某一项功能。插件框架里面可能需要定义多个接口,按照某一个原则对这些接口进行分类。比如日志操作接口,数据操作接口,权限操作接口。。。。。。可以在一个单元中集中定义插件框架中需要使用到的接口,然后在主控程序和各插件里面都要引用这个接口定义的单元
阅读全文
摘要:获取插件中的预约接口,调用预约接口中的方法执行插件中某一项功能。unit Loader;interfaceuses DLLLoader, uInterface, SysUtils, Classes, windows;type TLoader = class(TDLLLoader) private FInts: IModelInts; function GetInts: IModelInts; public destructor destroy; override; property ModelServiceInts: IModelInts read GetInts; end;implement
阅读全文