首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >64位XE2中Sharemem XE2的选择

64位XE2中Sharemem XE2的选择
EN

Stack Overflow用户
提问于 2014-11-12 23:19:32
回答 1查看 1.7K关注 0票数 2

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

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

Sharemem和SimpleSharemem之间有性能差异吗?在我描述的场景中,是否还有其他的理由更愿意选择其中一种而另一种(除了明显的FPC对Sharemem的支持)?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 03:37:42

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

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

然而,你所尝试的远不止这一点。您希望在由不同编译器编译的模块之间共享一个内存管理器。特别是Delphi和FPC。Delphi的ShareMem被设计为允许在Delphi编译的模块之间共享。同样,FPC的ShareMem被设计为允许两个FPC编译模块共享内存管理器。Delphi和FPC模块之间不支持共享。

更进一步,您希望能够在模块之间传递字符串对象。这要求string对象的实现在interop边界上兼容。德尔福的UnicodeString for XE2和XE7模块可能就是这样,但如果是这样的话,这只是偶然的。这一点不能保证。Delphi的未来版本可能会改变实现。至于混合Delphi和FPC字符串,没有理由相信它们可以混合。我怀疑他们能做到。

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

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

  1. 传递以空结尾的C字符串,PWideChar。传递文本时的琐碎。当传递文本时,这变得更加困难,因为您可能需要调用来分配,而调用方需要释放。要么导出一个代理程序,要么在共享堆上分配,例如COM堆。
  2. 使用COM BSTR类型。在Delphi和FPC中,这都是由WideString包装的。这种类型是为二进制互操作设计的。

我的选择是使用WideString

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26898535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档