gpt4 book ai didi

delphi - 在 64 位 XE2 中如何选择 Sharemem 与 SimpleSharemem

转载 作者:行者123 更新时间:2023-12-01 19:49:57 24 4
gpt4 key购买 nike

我无法清楚地了解使用 Sharemem 与 SimpleSharemem 在主程序和 DLL 之间传递字符串的优点/缺点。

以下是我研究此问​​题的背景:我的主程序是在 XE2 64 位中开发的(尽管我可能升级到 XE7),DLL 将使用 XE2(或更高版本)或 FPC 64 开发 -位(理想情况)。主程序和 DLL 需要能够传递记录中包含的字符串。理想情况下,我希望由没有 Delphi 的人开发 DLL,并且 FPC 似乎支持 Sharemem,但不支持 SimpleSharemem。

Sharemem 与 SimpleSharemem 之间是否存在性能差异?在我描述的场景中是否还有其他原因选择其中一种(除了对 Sharemem 的明显 FPC 支持)?

谢谢!

最佳答案

Sharemem 是共享内存管理器的旧方法。它依赖于与应用程序一起部署的 DLL。 SimpleSharemem 旨在与 FastMM 配合使用,FastMM 以与 Sharemem 不同的方式处理共享。因此,对于使用 FastMM 作为内存管理器的现代版本的 Delphi,请使用 SimpleSharemem

<小时/>

共享内存管理器允许您使用标准语言堆函数(例如 GetMemNew 等)在一个模块中分配内存并在另一个模块中释放内存。

但是,您的尝试远不止于此。您希望在不同编译器编译的模块之间共享内存管理器。特别是德尔福和FPC。 Delphi 的 ShareMem 旨在允许在 Delphi 中编译的模块之间共享。同样,FPC 的 ShareMem 旨在允许两个 FPC 编译模块共享内存管理器。不支持Delphi和FPC模块之间的共享。

更进一步,您希望能够在模块之间传递字符串对象。这要求字符串对象的实现能够跨互操作边界兼容。对于 XE2 和 XE7 模块来说,Delphi 的 UnicodeString 可能就是这种情况,但如果是这样,那也只是偶然的。对此没有任何保证。 Delphi 的 future 版本可能会改变实现。至于混合Delphi和FPC字符串,没有理由相信它们可以混合。我怀疑他们可以。

所以我的建议是停止尝试使用共享内存管理器,并停止尝试在用不同语言编译的模块之间传递 native 语言字符串。

为了在混合编译器环境中的模块之间传递文本,您需要使用有效的类型进行二进制互操作。典型的方法包括:

  1. 传递以 null 结尾的 C 字符串,PWideChar。传入文本时很简单。传出文本时,这会变得更加困难,因为您可能需要被调用者进行分配,但需要调用者进行取消分配。导出释放器或在共享堆上分配,例如COM 堆。
  2. 使用 COM BSTR 类型。在 Delphi 和 FPC 中,它都由 WideString 包装。该类型专为二进制互操作而设计。

我的选择是使用WideString

关于delphi - 在 64 位 XE2 中如何选择 Sharemem 与 SimpleSharemem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898535/

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