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