GCC dll用于Delphi ShareMem应用程序

时间:2013-04-18 17:13:12

标签: c delphi gcc

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

现在我需要在C中重写这个dll(mingw更可取)并为主应用程序编译dll,用Delphi 7编写。

如何实现?我是否需要在C中重写borland内存管理器,还是应该编写一些接口以将其与borlndmm.dll一起使用?

1 个答案:

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

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

  3. <强>更新

    您在评论中说明:

      

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

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

    包装器DLL就是所谓的适配器