arrays - 从 Dll 返回 TCollection 或对象数组

标签 arrays delphi dll dynamic tcollection

我尝试从 dll 函数返回我自己的对象(源自 TCollection)。我使用了FastMemoryManager,但没有成功......所以我尝试返回一些对象的动态数组。
当然在dll函数中设置的数组的长度。 它工作得很好,但分配的内存没有被释放。
(我使用 Windows 任务管理器进行测量)。是否有可能如何释放动态数组? 调用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) 则会引发异常。

有什么建议吗?

最佳答案

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

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

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

关于arrays - 从 Dll 返回 TCollection 或对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708458/

相关文章:

arrays - 使用索引和数组通过函数创建数组?

Java 运算符证明包含在数组中

performance - 在 Delphi 中保护/加密嵌入式数据库

c# - 从用 C++ 编写的桌面应用程序过渡到基于 Web 的应用程序

c# - 更改 c/c++ dll 中的参数

Java System.loadLibrary 依赖项

arrays - mongoDB - 如何在数组内的对象中更新/插入字段?

java - 使用java删除另一个数组中的数组

delphi - 在 Delphi 中仅设计一个 VCL 组件的样式

delphi - 为什么我的带有整数字段的参数化查询失败?