繁体   English   中英

GCC dll用于Delphi ShareMem应用程序

[英]GCC dll for use with Delphi ShareMem application

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

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

怎么能实现呢? 我是否需要在C中重写borland内存管理器,还是应该编写一些与borlndmm.dll一起使用的接口?

当您在一个模块中使用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. 仅在两个模块之间传递标准互操作类型。 即:整数类型,浮点类型,以空值终止的字符串指针。 复合类型,记录和数组,只包含标准的互操作类型。

更新

你在评论中说:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM