所以我有一个主机 Delphi 7 应用程序,它必须在它的 dll 中分配和销毁字符串。当然,dll也是用对象Pascal编写的,ShareMem
首先使用并一直Borlndmm.dll
放在它的文件夹中。
现在我需要用 C 重写这个 dll(最好是 mingw)并为主应用程序编译 dll,用 Delphi 7 编写。
怎样才能做到这一点?我需要用 C 重写 borland 内存管理器还是应该编写一些接口来使用它borlndmm.dll
?
Sharemem
当您在一个模块中使用 Delphi 堆进行分配,并在不同模块中使用相同的堆释放它们时,您需要使用。该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 就是所谓的适配器。