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

标签 delphi dll plugins memory-management delphi-2009

对于服务器端插件框架,我想实现 DLL,它公开返回类引用 (TInterfacedClass) 的 RegisterPlugin 方法。

然后,主机应用程序创建此类的实例,并且实例将在主机线程的上下文中运行。 (这与 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 版本,您将需要重建所有内容(从而失去从实现插件框架中获得的任何优势)。

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

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

然后导出具有此签名的函数:

function RegisterPlugin: IFactoryInterface;

关于delphi - 基于TInterfacedClass的Delphi插件框架的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5448543/

相关文章:

delphi - 尝试打开另一个表单时发生访问冲突

dll - 使用 dll api 时出现意外错误地址 0x0

javascript - 在设定时间禁用/启用色带

winapi - 如何保护自己免受 shell DLL 加载到进程中的影响?

c++ - 确保使用 Windows Phone 应用程序部署 C++ DLL 的正确方法

vim - 从 vim 中完全删除 NERDTree?

jquery 从元素中删除插件

multithreading - 有用于 Delphi 和 Free Pascal 的多线程跨平台库吗?

sql-server - SQL Server 2014 中的列名无效

delphi - 如何将特定节点移动到第一个索引?