【问题标题】:How to Choose Sharemem vs SimpleSharemem in 64-bit XE2如何在 64 位 XE2 中选择 Sharemem 与 SimpleSharemem
【发布时间】:2014-11-12 23:19:32
【问题描述】:

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

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

Sharemem 与 SimpleSharemem 之间是否存在性能差异?在我描述的场景中,是否还有其他理由更喜欢其中一种(除了明显的 FPC 对 Sharemem 的支持)?

谢谢!

【问题讨论】:

  • Sharemem(任何一种形式)都不会为您做任何事情,因为您没有在同一个 Delphi 版本中进行编译。不要跨界使用字符串。使用 PChar。

标签: delphi 64-bit delphi-xe2


【解决方案1】:

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


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

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

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

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

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

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

我的选择是使用WideString

【讨论】:

  • 这是非常有用的建议,部分回答了问题。我仍然有兴趣了解 Win64 中 Sharemem 与 SimpleSharemem 的优缺点。
  • 问题似乎很清楚,您想使用不同的编译器。不是这样吗?无论如何,一般的利弊问题都是题外话。
  • 您可以将其表述为“既然存在 Sharemem,为什么还要存在 SimpleSharemem”?
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2021-08-28
  • 2011-04-09
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多