我很难清楚地了解使用Sharemem在主程序和DLL之间传递字符串的优缺点。
下面是我研究这个问题的背景:我的主程序是用XE2 64位开发的(尽管我可以升级到XE7),DLL要么用XE2 (或更高的)或者FPC 64位(理想的场景)开发。主程序和DLL需要能够传递记录中包含的字符串。理想情况下,我希望由可能没有Delphi的人开发DLL,看起来好像FPC支持Sharemem,但不支持SimpleSharemem。
Sharemem和SimpleSharemem之间有性能差异吗?在我描述的场景中,是否还有其他的理由更愿意选择其中一种而另一种(除了明显的FPC对Sharemem的支持)?
谢谢!
发布于 2014-11-13 03:37:42
Sharemem
是共享内存管理器的旧方法。它依赖于与应用程序一起部署的DLL。SimpleSharemem
被设计为与FastMM一起工作,后者以与Sharemem
不同的方式处理共享。因此,对于使用FastMM作为内存管理器的Delphi的现代版本,请使用SimpleSharemem
。
共享内存管理器允许您使用标准语言堆函数(如GetMem
、New
等)在一个模块中分配内存,在另一个模块中释放。
然而,你所尝试的远不止这一点。您希望在由不同编译器编译的模块之间共享一个内存管理器。特别是Delphi和FPC。Delphi的ShareMem
被设计为允许在Delphi编译的模块之间共享。同样,FPC的ShareMem
被设计为允许两个FPC编译模块共享内存管理器。Delphi和FPC模块之间不支持共享。
更进一步,您希望能够在模块之间传递字符串对象。这要求string对象的实现在interop边界上兼容。德尔福的UnicodeString
for XE2和XE7模块可能就是这样,但如果是这样的话,这只是偶然的。这一点不能保证。Delphi的未来版本可能会改变实现。至于混合Delphi和FPC字符串,没有理由相信它们可以混合。我怀疑他们能做到。
因此,我的建议是停止尝试使用共享内存管理器,并停止尝试在用不同语言编译的模块之间传递本机语言字符串。
为了在混合编译器环境中的模块之间传递文本,需要为二进制互操作使用有效类型。典型的做法包括:
PWideChar
。传递文本时的琐碎。当传递文本时,这变得更加困难,因为您可能需要调用来分配,而调用方需要释放。要么导出一个代理程序,要么在共享堆上分配,例如COM堆。WideString
包装的。这种类型是为二进制互操作设计的。我的选择是使用WideString
。
https://stackoverflow.com/questions/26898535
复制相似问题