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



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

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

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

谢谢!

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


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

然而,你的尝试远不止于此。您希望在由不同编译器编译的模块之间共享内存管理器。特别是Delphi和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

最新更新