对于服务器端插件框架,我想实现公开一个返回类引用(TInterfacedClass)的RegisterPlugin方法的DLL。基于TInterfacedClass的Delphi插件框架的内存管理
主机应用程序然后创建此类的实例,并且实例将在主机线程的上下文中运行。 (这与例如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.
工厂接口可以与所有版本的Delphi一起工作(只要与GUID相关的接口在主机和DLL中相同? – mjn 2011-03-27 10:21:58
这是COM不是吗? – 2011-03-27 10:38:32
@mjin,是的,接口有一个明确定义二进制接口与给定GUID的接口预期(并且由编译器信任)具有特定的VMT *练习:*在单元A中定义接口“ITestIntf”。将单元B中相同的定义复制粘贴。如果尝试执行'var i1:A.ITestIntf:= B.ITestIntf'编译器会抱怨,因为'A.ITestIntf'与'B.ITestIntf'不兼容。如果你做了'var i1:A.ITestIntf:= B.ITestIntf as A.ITestIntf'赋值按预期工作,因为这两个声明都有相同的GUID – 2011-03-27 16:53:04