所以我有一个主机Delphi 7应用程序,它必须在它的dll中分配和销毁字符串。当然,dll也是用对象Pascal编写的,并且首先使用ShareMem
并且始终在其文件夹中携带Borlndmm.dll
。
现在我需要在C中重写这个dll(mingw更可取)并为主应用程序编译dll,用Delphi 7编写。
如何实现?我是否需要在C中重写borland内存管理器,还是应该编写一些接口以将其与borlndmm.dll
一起使用?
答案 0 :(得分:2)
当您在一个模块中使用Delphi堆进行分配时,需要使用Sharemem
,并在另一个模块中使用相同的堆取消分配它们。 Sharemem
单元确保两个模块中的内存分配共享相同的分配器。
现在,您可以使用Delphi可执行文件和Delphi DLL执行此操作,前提是可执行文件和DLL都使用相同版本的Delphi进行编译。但是你无法使用Delphi可执行文件和C DLL完成任务。你不能在Delphi中分配内存,并期望你的C DLL能够解除分配它。 C运行时不会将malloc / free映射到对共享内存管理器的调用。
您的问题清楚地表明您希望在Delphi中分配Delphi字符串并将其传递给C DLL。然后在该C DLL中释放它。那么你无法合理地期望这样做。 Delphi字符串必须由Delphi运行时管理。你的C DLL中没有那个。
现在,您可以设计一种在C语言中模拟Delphi运行时的方法,以便您可以与字符串互操作。但我认为这是一个坏主意。相反,你应该做的是遵循标准的互操作实践:
<强>更新强>
您在评论中说明:
问题是我没有Delphi应用程序的源代码。
这会让你陷入困境。您无法更改DLL的接口。解决方案是创建一个用Delphi 7编写的瘦包装DLL。该包装DLL应该使用Sharemem
并且可以创建被主机可执行文件销毁的字符串。包装器DLL将来自主机可执行文件的任何请求转发到新的C DLL。 Delphi 7包装器和新的C DLL之间的互操作遵循标准的互操作准则。
包装器DLL就是所谓的适配器。