我试图从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)异常被引发。
有什么建议吗?
答案 0 :(得分:6)
ShareMem是所有Delphi DLL和EXE项目文件中的第一个单元吗? FastMM已经是过去几个Delphi版本的RTL内存管理器。
我建议不要在DLL和EXE之间共享对象;这只是一种痛苦的方法。改为使用包。
如果你必须使用DLL,我建议采用通常的WinAPI约定:stdcall调用约定,只使用C兼容的数据类型(整数,浮点数,指针,没有托管类型字段的记录,如字符串,数组或接口)。让DLL不分配EXE负责释放的内存。相反,让EXE分配并传递DLL内存;或者,将分配封装到逻辑句柄中,并从DLL导出处理存储器的函数,例如, CloseHandle
WinAPI函数如何工作。