【问题标题】:How can I find out how many GDI objects my process is allowed to create?如何找出允许我的进程创建多少个 GDI 对象?
【发布时间】:2011-04-22 00:49:19
【问题描述】:

有一个注册表项,我可以在其中检查(和设置)当前为进程设置的 GDI 对象配额。但是,如果用户更改了该注册表项,则该值将保持旧值,直到重新启动。在我的程序中,我需要知道是否有办法以编程方式确定我可以创建多少 GDI 对象。是否有用于获取当前进程的 GDI 信息的 API?在系统层面呢?

【问题讨论】:

  • 你不是真的想知道你可以创建多少 GDI 对象吗?当你来到 SO 时,你不能专注于解决你自己的问题,而是要很好地解释它。在这种情况下,“找出配额是什么”实际上并不是您的目标,而只是一种可能的方法,您的问题应该反映这一点。
  • 谢谢@Ben。改写了问题。

标签: windows winapi operating-system gdi


【解决方案1】:

如果您想找到对您很重要的当前配额,请创建 GDI 对象直到失败。记录那个号码。然后,将它们全部销毁。

如果您想定期执行此操作以获得准确的数字,您可以这样做。不过,它可能会相当昂贵。

【讨论】:

  • 接受,因为它明确回答了所提出的问题。
【解决方案2】:

既然汉斯已经提到雷蒙德,我们应该玩他的“想象一下,如果这是真的”游戏。如果这个 API - GetGDIObjectLimit 或其他 - 存在,它会返回什么?如果对象计数限制为 10000,那么您希望它返回该值吗?那么当系统内存不足时会发生什么? API 告诉您一个没有实际意义的值。如果您接近 10000 个 GDI 对象,那么您做错了什么,您应该集中精力修复它。

【讨论】:

  • 这不能回答问题。无论如何,达到 10000 并不一定意味着一个人做错了什么。假设您的应用程序能够一次启动多个文档,并且父文档引用了所有这些文档。如果您使用的是具有 16 Gb RAM 的 x64,那么实现这一点是非常切实的。以 Araxis 合并为例。您可以打开一个文件夹,比较两张充满数据的 DVD,并很快达到限制。
  • 公平点,它没有回答问题。如果您在一个限制为 10000 个对象的操作系统上运行,并且您达到了该限制,那么您做错了什么。现在,如果您在没有该限制的其他操作系统上运行,那么您就可以了。提问者并没有使用那个操作系统。
【解决方案3】:

总是很难证明 API 确实不存在,但这个是 95% 的不可行。很多系统设置都是通过注册表配置的,之后没有 API 进行调整。

Raymond Chen 对此类问题的典型回答是“如果你想知道,那你就做错了”。在这里适用,10,000 个句柄的默认配额是巨大的。

【讨论】:

  • 我的应用程序能够打开带有各种子文档的非常非常大的 MDI 文档。在某些情况下,我们会达到 GDI 对象限制。我试图弄清楚限制是什么,以便我可以判断用户是否接近阈值并且不允许他们打开任何进一步的文档。我宁愿在抛出 GDI 异常之前这样做。
  • 这没有多大意义,你的屏幕没有变大。你最好去寻找泄漏,用MFC很容易泄漏。谷歌“gdileaks.exe”。
  • 是的,这非常适合长期解决方案,但我想在短期内阻止客户现在达到配额限制。这使我能够修复漏洞,而不会因为软件崩溃而让客户生气。
  • 哇,好痛。他们真的对他们正在入侵注册表感到绝望吗?难怪他们会生气,最好把它作为一个短期目标。显然,在程序运行时调整注册表设置没有任何效果,所以告诉他们停止这样做。而且你的“我要崩溃了”消息框是准确的。
  • 感谢您的反馈,汉斯。非常感谢。
猜你喜欢
  • 2023-02-11
  • 1970-01-01
  • 2017-03-21
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2011-06-14
  • 2019-06-07
相关资源
最近更新 更多