gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:59:01 25 4
gpt4 key购买 nike

对于服务器端插件框架,我想实现 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com