(* * Unit owner: D10.天地弦 * blog: http://www.cnblogs.com/dksoft * * v0.1.1 (2014-09-03 23:46:16) * 添加 IApplicationContextEx01接口 * 可以实现手动加载DLL和配置文件 * * v0.1.0(2014-08-29 13:00) * 修改加载方式(beanMananger.dll-改造) * * v0.0.1(2014-05-17) * + first release * * 核心框架接口文件 IApplicationContext: 主控台必须要实现的接口 IBeanFactory: 插件宿主必须要实现的接口 *) unit mybean.core.intf; interface type /// /// 接口已经改变需要重新编译所有的DLL和主控台 /// 2014年5月15日 20:55:28 /// D10.天地弦 /// 添加了 checkFinalize /// 修改了 checkInitialize(pvLoadLib:Boolean);stdcall; 添加了参数 /// IApplicationContext = interface(IInterface) ['{0FE2FD2D-3A21-475B-B51D-154E1728893B}'] /// /// 初始化配置(线程不安全), /// pvLoadLib为true时加载配置文件的同时加载DLL文件(服务端程序推荐) /// 为flase时只加载配置文件(客户端程序推荐) /// pvUseLibCache为true时copy,dll文件到Plug-ins-cache文件夹然后进行加载 /// 为false时不进行copy,原来目录进行加载 /// procedure checkInitialize; stdcall; /// /// 执行反初始化在程序准备退出的时候使用 /// procedure checkFinalize; stdcall; /// /// 获取一个bean接口(线程安全) /// 如果单实例内部开启互斥 /// function getBean(pvBeanID: PAnsiChar): IInterface; stdcall; /// /// 获取beanID对应的工厂接口 /// function getBeanFactory(pvBeanID:PAnsiChar):IInterface; stdcall; end; IApplicationContextEx01 = interface(IInterface) ['{10009F97-1949-476D-9CE1-1AF003B47DCB}'] /// /// 加载库文件 /// /// /// 加载成功返回true, 失败返回false, 可以用raiseLastOsError获取异常 /// /// (PAnsiChar) function checkLoadLibraryFile(pvLibFile:PAnsiChar): Boolean; stdcall; /// /// 加载配置文件 /// /// /// 加载失败返回false<文件可能不存在> /// /// (PAnsiChar) function checkLoadBeanConfigFile(pvConfigFile:PAnsiChar): Boolean; stdcall; end; /// /// 主控台扩展接口 /// 2014-09-22 12:27:56 /// IApplicationContextEx2 = interface(IInterface) ['{401B2E73-3C6B-4738-9DE4-B628EE5E1D44}'] /// /// 卸载掉指定的插件宿主文件(dll) /// 在卸载之前应该释放掉由所创建的对象实例,和分配的内存空间, /// 否则会在退出EXE的时候,出现内存访问违规错误 /// 卸载如果出现问题, 返回false,请查看日志文件 /// *(谨慎使用) /// function unLoadLibraryFile(pvLibFile: PAnsiChar; pvRaiseException: Boolean = true): Boolean; stdcall; /// /// 判断BeanID是否存在 /// function checkBeanExists(pvBeanID:PAnsiChar):Boolean; stdcall; end; /// /// 主控台扩展接口 /// 2014-11-14 12:40:17 /// IApplicationContextEx3 = interface(IInterface) ['{4D0387BC-0FF8-4D89-B064-C8C30AA432BE}'] /// /// 获取所有Bean信息 /// result: 返回读取到的数据长度 /// pvLength: 尝试读取的长度,传入的pvBeanInfo必须分配有足够的内存 /// pvBeanInfo: 返回读取到的数据 /// utf8 AnsiString /// [ /// {"id":"beanid", "lib":"libfile"} /// ... /// ] /// function GetBeanInfos(pvBeanInfo:PAnsiChar; pvLength:Integer): Integer; stdcall; end; /// /// 插件工厂接口,由插件宿主(DLL, BPL)库文件提供 /// IBeanFactory = interface(IInterface) ['{480EC845-2FC0-4B45-932A-57711D518E70}'] /// /// 获取所有的插件ID /// 返回获取ID的长度分隔符#10#13 /// function getBeanList(pvIDs:PAnsiChar; pvLength:Integer): Integer; stdcall; /// /// 根据beanID获取对应的插件 /// function getBean(pvBeanID: PAnsiChar): IInterface; stdcall; /// /// 初始化,加载DLL后执行 /// procedure checkInitalize;stdcall; /// /// 卸载DLL之前执行 /// procedure checkFinalize;stdcall; /// /// 配置所有bean的相关的配置,会覆盖之前的Bean配置 /// pvConfig是Json格式 /// beanID(mapKey) /// { /// id:xxxx, /// ..... /// } /// function configBeans(pvConfig:PAnsiChar):Integer; stdcall; /// /// 配置bean的相关信息 /// pvConfig是Json格式的参数 /// 会覆盖之前的bean配置 /// { /// id:xxxx, /// ..... /// } /// function configBean(pvBeanID, pvConfig: PAnsiChar): Integer; stdcall; /// /// 配置bean配置 /// pluginID,内部的插件ID /// function configBeanPluginID(pvBeanID, pvPluginID: PAnsiChar): Integer; stdcall; /// /// 配置bean配置 /// singleton,单实例, /// 配置单实例时,请注意要么对象有接口管理生命周期,要么实现IFreeObject接口 /// 不要手动释放释放对象. /// function configBeanSingleton(pvBeanID: PAnsiChar; pvSingleton:Boolean): Integer; stdcall; end; /// /// 插件工厂注册 /// IbeanFactoryRegister = interface(IInterface) ['{C06270CF-FF16-4AB0-89D7-3D8C3D8D9820}'] /// /// 直接注册Bean工厂插件, 单EXE可以直接注册 /// function registerBeanFactory(const pvFactory: IBeanFactory; const pvNameSapce:PAnsiChar):Integer;stdcall; end; IErrorInfo = interface(IInterface) ['{A15C511B-AD0A-43F9-AA3B-CAAE00DC372D}'] /// /// 获取错误代码,没有错误返回 0 /// function getErrorCode: Integer; stdcall; /// /// 获取错误信息数据,返回读取到的错误信息长度, /// 如果传入的pvErrorDesc为nil指针,返回错误信息的长度 /// function getErrorDesc(pvErrorDesc: PAnsiChar; pvLength: Integer): Integer; stdcall; end; IFreeObject = interface ['{863109BC-513B-440C-A455-2AD4F5EDF508}'] procedure FreeObject; stdcall; end; IKeyMap = interface(IInterface) ['{3CF4907D-C1FF-4E93-9E32-06AAD82310B4}'] /// /// 判断是否存在接口 /// function existsObject(const pvKey:PAnsiChar):Boolean; stdcall; /// /// 根据key值获取接口 /// function getObject(const pvKey:PAnsiChar):IInterface; stdcall; /// /// 赋值接口 /// procedure setObject(const pvKey:PAnsiChar; const pvIntf: IInterface); stdcall; /// /// 移除接口 /// procedure removeObject(const pvKey:PAnsiChar); stdcall; /// /// 清理对象 /// procedure cleanupObjects; stdcall; end; IBeanConfigSetter = interface(IInterface) ['{C7DABCDB-9908-4C43-B353-647EDB7F3DCE}'] /// /// 设置配置中的Config /// /// /// 配置文件中JSon格式的字符串 /// procedure setBeanConfig(pvBeanConfig: PAnsiChar); stdcall; end; var appPluginContext:IApplicationContext; applicationKeyMap:IKeyMap; implementation initialization appPluginContext := nil; applicationKeyMap := nil; finalization appPluginContext := nil; applicationKeyMap := nil; end.