从dll使用接口是否安全

时间:2012-01-13 05:55:45

标签: delphi memory-management dll

当我想在DLL中导出类时,从接口派生它并通过导出函数返回该接口是否正确?

//exported dll function, which is used in the exe.
function MyClass_Create: IMyClass;
begin
  result := TMyClass.Create;
end;

内存管理怎么样?我可以传入/传出不同的接口和字符串而不用担心和崩溃吗?

IMyClass = interface
  procedure SetString(aMsg: string);
  function GetString: string;

  procedure SetClass(aClass: ITestClass);
  function GetClass: ITestClass;
end;

2 个答案:

答案 0 :(得分:5)

接口引用与内存管理正交。通常导出一个从dll返回接口引用的函数,而不关心内存管理。使用引用计数接口,您可以确保实现接口的对象实例也将在dll中释放。

字符串不同。导出接口或导出平面函数无关紧要 - 同样的限制适用。

BTW您的问题标题不正确,Delphi中没有“界面实例”。

答案 1 :(得分:3)

使用这样的接口将确保在同一堆上创建和释放实现接口的对象。

但是,这不能解决在不同堆上分配和释放动态字符串类型的问题。有许多可能的解决方案,但在我看来,最好的方法是在模块边界使用WideString。

WideString类型是COM BSTR的包装,并在共享COM堆上分配。您只需要使用WideString作为接口。实现类的内部可以使用本机Delphi字符串。

就像字符串存在问题一样,动态数组也是如此。尝试跨模块边界传递动态数组并不安全。没有解决方案和WideString一样方便。你可以使用变量数组,但与WideString相比,它非常笨重。