【问题标题】:GCC dll for use with Delphi ShareMem application用于 Delphi ShareMem 应用程序的 GCC dll
【发布时间】:2013-04-18 17:13:11
【问题描述】:

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

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

如何实现?我需要用 C 重写 borland 内存管理器还是应该编写一些接口来使用它与borlndmm.dll?

【问题讨论】:

    标签: c delphi gcc


    【解决方案1】:

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

    更新

    您在 cmets 中声明:

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

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

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

    【讨论】:

    • 谢谢,但 dll 的目的是创建字符串并将其传递给主应用程序,然后将其处理掉。我实际上需要在 delphi 中重新编译主机应用程序版本,因为在 gcc 下编译 dll 太复杂了。
    • 在模块之间传递一个以空字符结尾的字符数组。在mingw下编译DLL很简单。
    • @DavidHeffernan 是否有一些指导如何在C++ 和Delphi 之间共享类型?比如字符串、数组、记录、类等。FPC有一个特性,可以使用GCC编译的类。
    • @user 这样做可能是个坏主意,甚至可能无法处理。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多