从Dll返回TCollection或对象数组

时间:2010-09-14 11:36:56

标签: arrays delphi dll dynamic tcollection

我试图从dll函数返回我自己的对象(从TCollection派生)。我使用FastMemoryManager,但没有成功......所以我试图返回一些对象的动态数组。
当前在dll函数中的数组的长度。 它工作得很好,但是没有释放分配的内存。
(我用Windows tarsk经理测量)。是否有可能如何释放动态数组? 调用dll函数的过程在线程中,最后我有:

for i := 0 to length(MyObjectArray) - 1 do begin
  if MyObjectArray[i] <> nil then
     MyObjectArray[i].Free;
end;
Setlength(MyObjectArray, 0);
MyObjectArray := nil;

如果我使用而不是 Setlength(MyObjectArray,0)和MyObjectArray:= nil,
FreeAndNil(MyObjectArray)异常被引发。

有什么建议吗?

1 个答案:

答案 0 :(得分:6)

ShareMem是所有Delphi DLL和EXE项目文件中的第一个单元吗? FastMM已经是过去几个Delphi版本的RTL内存管理器。

我建议不要在DLL和EXE之间共享对象;这只是一种痛苦的方法。改为使用包。

如果你必须使用DLL,我建议采用通常的WinAPI约定:stdcall调用约定,只使用C兼容的数据类型(整数,浮点数,指针,没有托管类型字段的记录,如字符串,数组或接口)。让DLL不分配EXE负责释放的内存。相反,让EXE分配并传递DLL内存;或者,将分配封装到逻辑句柄中,并从DLL导出处理存储器的函数,例如, CloseHandle WinAPI函数如何工作。