加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

基于TInterfacedClass的Delphi插件框架的内存管理

发布时间:2020-12-15 04:08:21 所属栏目:大数据 来源:网络整理
导读:对于服务器端插件框架,我想实现暴露RegisterPlugin方法的DLL,该方法返回类引用(TInterfacedClass). 然后,宿主应用程序创建此类的实例,实例将在主机线程的上下文中运行. (例如,这与Jedi VCL插件框架不同,后者在DLL或BPL中实例化插件并将实例返回给主机.) 首次
对于服务器端插件框架,我想实现暴露RegisterPlugin方法的DLL,该方法返回类引用(TInterfacedClass).

然后,宿主应用程序创建此类的实例,实例将在主机线程的上下文中运行. (例如,这与Jedi VCL插件框架不同,后者在DLL或BPL中实例化插件并将实例返回给主机.)

首次测试显示目前没有问题.但是,我应该注意内存管理的隐藏问题吗?当我在这个项目中使用Delphi 2009时,FastMM4是默认的内存管理器.

这里是插件DLL项目的草图:

library ExamplePlugin;
uses
  ...
type
  TPluginOne = class(TInterfacedObject,...)
  ...
  end;

function RegisterPlugin: TInterfacedClass; stdcall;
begin
  Result := TPluginOne;
end;

exports
  RegisterPlugin;

{ TPluginOne }
// ... plugin class implementation

begin  
end.

解决方法

内存管理器没有问题,因为FastMM作为EXE和DLL之间的共享内存管理器.但我真的不喜欢在DLL和EXE之间传递纯对象或(最差)元类的概念.问题是,EXE中的TInterfacedObject与DLL中的TInterfacedObject不同!当然,它们可能看起来完全一样,但它们不是!如果您为EXE或任何DLL升级Delphi版本,您将需要重建所有内容(从而失去您从实现插件框架中获得的任何优势).

一个更便携的解决方案是返回一个“工厂接口”,类似于:

IFactoryInterface = interface
[GUId-goes-here]
  function MakeWhateverInterfaceYouNeed: IUnknownDerivate
end;

然后使用此签名导出函数:

function RegisterPlugin: IFactoryInterface;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读