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

时间:2014-11-12 23:19:33

标签: delphi 64-bit delphi-xe2

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:7)

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


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

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

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

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

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

  1. 传递以null结尾的C字符串PWideChar。传递文本时很简单。当传递文本时,这变得更加困难,因为你可能需要被调用者来分配但是调用者要解除分配。导出解除分配器或在共享堆上分配,例如COM堆。
  2. 使用COM BSTR类型。在Delphi和FPC中,它由WideString包裹。此类型设计用于二进制互操作。
  3. 我的选择是使用WideString