【问题标题】:Share Memory Manager between Application and Package在应用程序和包之间共享内存管理器
【发布时间】:2010-03-01 17:59:52
【问题描述】:

这个问题是这个question.的后续问题

如何实现我的应用程序和我的运行时包使用相同的内存管理器?我认为这是默认情况下的情况,但由于我遇到奇怪的访问冲突和无效指针异常,我插入在进入运行时包之前和运行时包中调用GetMemoryManagerState,返回的状态似乎表明包和应用程序使用不同的内存管理器。

在调用runtime包中的方法之前,分配了61个介质块,调用之后(包内被调用方法的开头)分配了0个介质块。

你对此有什么解释吗?我该怎么做才能使包和应用程序共享内存管理器?使用 FastMM 时还有更复杂的问题吗?

编辑顺便说一句,有没有比比较内存管理器状态更好的方法来检查是否使用了相同的内存管理器? TMemoryManager 原来是记录,所以我无法比较地址。

【问题讨论】:

  • 默认情况下会这样做。你用的是什么 Delphi 版本?
  • 你如何加载包?动态还是不动态?应用程序是否使用“使用运行时包”编译?
  • ...这似乎是我错的地方。打开此选项似乎可以解决问题。所以我猜只有当 RTL 被用作运行时包时,内存管理器才是共享的。对吗?
  • 没错,粉碎者。 RTL 包是内存管理器所在的位置。如果您不共享 System 单元等,那么您就没有共享内存管理器。任何使用运行时包的程序都必须设置“使用运行时包”选项。您可以选择哪些运行时包被配置为使用,但其中一个包必须包含内存管理器,并且应用程序使用的所有其他包也必须需要该包。
  • 如果你不使用运行时包,你仍然会遇到同样的问题,让你决定使用包。你甚至不需要制作你的插件包。它们仍然可以是 dll。您只需要在运行时包中拥有共享代码。或者至少是 RTL 和 VCL 代码。

标签: delphi memory-management packages


【解决方案1】:

包使用与主程序相同的 RTL 状态。这是包定义的一部分。

包括内存管理器。

顺便说一句,我关于包的注释在这里:http://wiki.freepascal.org/packages

目前 FPC 离这还很远(主要是因为需要通过外部链接器在无数操作系统和架构上实现这一点)。此外,由于路由中的 FPC 版本数量较多,我怀疑它不会像许多人想象的那么有用(我不希望 Lazarus 组件以仅二进制 FPC 等效于 BPL/.dcp 组合的方式分发)

【讨论】:

  • 是的,假设程序是使用运行时包构建的,并且在项目选项中引用了rtl,并且包本身需要rtl.dcp。默认情况下是这种情况,但可以更改。
  • 有趣的点 TOndrej。不知道这是可能的。谢谢
  • 但是@Tondrej,如果你这样做了,你是不是也破坏了程序中的其他所有内容?我认为 Smasher 已经证明了这一点。
  • @Rob,是的,很有可能。但是 - 稍加注意 - 有可能在您自己的包中“重新捆绑”Delphi 单元并使用它们而不是提供的 rtl、vcl 等。也许在某些极端情况下有用,或者如果您想使用修改后的 RTL /VCL 单位。
  • TOndrej:与普通 DLL 相比,它作为一个包的重要性有多大?因为既不共享程序状态,也不共享 VMT。
【解决方案2】:

感谢ldsandonRob Kennedy,我发现有必要使用运行时包(至少对于 RTL),以便应用程序和包共享内存管理器。

启用“使用运行时包”并将“rtl”添加到包列表中解决了这个问题。感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2017-09-01
    • 1970-01-01
    • 2012-10-15
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多