【问题标题】:How can I detect from code when FastMM4 is used使用 FastMM4 时如何从代码中检测
【发布时间】:2021-05-31 06:25:04
【问题描述】:

我想在使用 FastMM4 时在表单上显示一个标签(项目文件中的“使用”),这样我就不会错误地将可执行文件提供给没有 FastMM_FullDebugMode.dll 的人已安装。

我试过这些,但它们没有效果:

{$ifdef FullDebugMode}
LblFastMM4.Visible := true;
{$endif}

{$ifdef EnableMemoryLeakReporting}
LblFastMM4.Visible := true;
{$endif}

如何在运行时检测 FastMM4?

注意:我不会“正式”使用 FastMM4 分发该应用程序。当我想将 alpha 版本提供给非技术用户快速浏览时,这只是对我自己的一个提醒。如果他们遇到错误会很烦人。

【问题讨论】:

  • "这样我就不会犯错误,将可执行文件提供给没有安装 FastMM_FullDebugMode.dll 的人" - 为什么不简单地部署 DLL与您的应用程序?安装 DLL 不是用户的责任。这是您的应用程序,您有责任部署和安装它需要的任何依赖项。
  • 再一次,您为什么不简单地部署 DLL 与您提供的每个 alpha 版本?没那么难。
  • 可以为 FastMM 配置很多选项。在您的情况下,选项 DoNotInstallIfDLLMissing 可能是有价值的。一个不错的应用程序可用于设置选项:jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html
  • @Erwin 我测试了你的建议,效果很好。你能把它作为一个答案,这样我就可以投票了
  • @Jan Doggen 很高兴听到这个消息!

标签: delphi delphi-10.3-rio


【解决方案1】:

您的{$ifdef} 不起作用,因为您自己的代码没有直接包含FastMM4Options.inc,因此FastMM 的条件不在您的代码范围内定义。它们仅在 FastMM 的代码范围内定义。你不能测试在别人的单元中是{$define}'d 的条件。

但是,您可以使用{$If Declared(...)} 来检查是否在使用另一个单元的范围内的公共符号。在这种情况下,FastMM4.pasinterface 部分在特定条件下声明了各种符号,例如定义 EnableMemoryLeakReporting 时的 TRegisteredMemoryLeak,定义 FullDebugMode 时的 DebugGetMem 等。

{$if declared(DebugGetMem)}
LblFastMM4.Visible := true;
{$endif}

{$if declared(TRegisteredMemoryLeak)}
LblFastMM4.Visible := true;
{$endif}

【讨论】:

  • 经过 40 年的编程,仍有一些东西需要学习:我没有听过您在第一段中所说的内容。但是请注意:这些符号在我的表单中是未知的,除非我在那里使用 FastMM4。没关系,我可以禁用两个使用文件而不是一个。一个会更好;-)
  • @JanDoggen 你读过我链接的文档吗?如果FastMM4 不在您的表单的uses 子句中,或者如果它没有使用您感兴趣的特定条件编译,那么{if} 将简单地评估为假
【解决方案2】:

可以为 FastMM 配置很多选项。在您的情况下,选项 DoNotInstallIfDLLMissing 可能很有价值。一个不错的应用程序可用于设置选项:https://jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html

【讨论】:

  • 这对我来说很好,所以我将其标记为“正确”答案。如果我现在不小心给了某人一个包含 FastMM 的可执行文件,他们不会收到丢失的 DLL 错误
【解决方案3】:

试试这个: LblFastMM4.Visible := InitializationCodeHasRun;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2018-02-06
    • 2011-03-04
    相关资源
    最近更新 更多