0

所以我有一个主机 Delphi 7 应用程序,它必须在它的 dll 中分配和销毁字符串。当然,dll也是用对象Pascal编写的,ShareMem首先使用并一直Borlndmm.dll放在它的文件夹中。

现在我需要用 C 重写这个 dll(最好是 mingw)并为主应用程序编译 dll,用 Delphi 7 编写。

怎样才能做到这一点?我需要用 C 重写 borland 内存管理器还是应该编写一些接口来使用它borlndmm.dll

4

1 回答 1

2

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 运行时,以便您可以与字符串进行互操作。但我认为这是个坏主意。相反,您应该遵循标准互操作实践:

  1. 安排在分配它的同一模块中释放内存。
  2. 仅在两个模块之间传递标准互操作类型。即:整数类型、浮点类型、以null结尾的字符串指针。以及仅包含标准互操作类型的复合类型、记录和数组。

更新

你在评论中说:

问题是我没有 Delphi 应用程序的源代码。

这让你陷入了困境。您不能更改 DLL 的接口。解决方案是制作一个用 Delphi 7 编写的瘦包装 DLL。该包装 DLL 应该使用Sharemem并且可以创建被主机可执行文件破坏的字符串。包装 DLL 将来自主机可执行文件的任何请求转发给新的 C DLL。Delphi 7 包装器和新的 C DLL 之间的互操作遵循标准互操作指南。

包装 DLL 就是所谓的适配器

于 2013-04-18T17:22:36.010 回答