gpt4 book ai didi

c - 用于 Delphi ShareMem 应用程序的 GCC dll

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:50 25 4
gpt4 key购买 nike

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

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

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

最佳答案

当您在一个模块中使用 Delphi 堆进行分配并在另一个模块中使用相同的堆释放它们时,您需要使用 SharememSharemem 单元确保两个模块中的内存分配共享同一个分配器。

现在,您可以使用 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 结尾的字符串指针。以及仅包含标准互操作类型的复合类型、记录和数组。

更新

您在评论中声明:

The problem is I don't have soucecode of Delphi app.

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

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

关于c - 用于 Delphi ShareMem 应用程序的 GCC dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com