Windows 我如何知道我的进程可以创建多少GDI对象?

Windows 我如何知道我的进程可以创建多少GDI对象?,windows,winapi,operating-system,gdi,Windows,Winapi,Operating System,Gdi,有一个注册表项,我可以在其中检查并设置当前为进程设置的GDI对象配额。但是,如果用户更改了该注册表项,则在重新启动之前,该值保持为旧值。在我的程序中,我需要知道是否有一种方法可以通过编程确定我可以创建多少个GDI对象。是否有用于获取当前流程的GDI信息的API?那么在系统级呢?总是很难证明确实没有API,但这是一个95%的禁忌。许多系统设置都是通过注册表配置的,没有API在之后对其进行调整 雷蒙德·陈对这些问题的典型回答是“如果你想知道,那么你做错了”。它适用于这里,10000个句柄的默认配额是

有一个注册表项,我可以在其中检查并设置当前为进程设置的GDI对象配额。但是,如果用户更改了该注册表项,则在重新启动之前,该值保持为旧值。在我的程序中,我需要知道是否有一种方法可以通过编程确定我可以创建多少个GDI对象。是否有用于获取当前流程的GDI信息的API?那么在系统级呢?

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


雷蒙德·陈对这些问题的典型回答是“如果你想知道,那么你做错了”。它适用于这里,10000个句柄的默认配额是巨大的。

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

如果你想找到对你来说重要的当前配额,创建GDI对象,直到失败为止。记下那个数字。然后,把它们全部摧毁


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

我的应用程序能够打开包含各种子文档的非常非常大的MDI文档。在某些情况下,我们会达到GDI对象限制。我试图找出限制是什么,这样我就可以知道用户是否接近阈值,并且不允许他们打开任何进一步的文档。我宁愿在抛出GDI异常之前这样做。这没有多大意义,你的屏幕不会变大。你最好去查漏,MFC很容易漏。谷歌'gdileaks.exe'。是的,这是一个伟大的长期解决方案,但我想防止客户获得配额限制现在,在短期内。这使我能够修复漏洞,而不会因为软件崩溃而激怒客户。哇,很痛苦。他们真的那么绝望以至于入侵了注册表吗?难怪他们会生气,最好把这作为一个短期目标。显然,在程序运行时调整注册表设置没有效果,所以请告诉他们停止这样做。你的“我要崩溃了”留言框会很准确。谢谢你的反馈,汉斯。非常感谢。你不是真的想知道你还可以创建多少GDI对象吗?当你做到这一点时,你必须专注于解释问题,而不是解决你自己的问题。在这种情况下,“找出配额是什么”实际上不是你的目标,而是一种可能的方法,你的问题应该反映出来。谢谢@Ben。重新编写问题。接受,因为它明确回答了问题。这不回答问题。无论如何,达到10000并不一定意味着一个人做错了什么。假设您的应用程序能够一次启动多个文档,并且父文档引用了所有这些文档。如果您使用的是16 Gb RAM的x64,那么实现这一点是非常明显的。以Araxis merge为例。你可以打开一个文件夹,比较两张装满数据的DVD,很快就达到了极限。公平地说,这并不能回答问题。如果您运行的操作系统限制为10000个对象,并且您达到了该限制,那么您就做错了。现在,如果你运行的是一个没有这个限制的不同操作系统,那么你就没事了。提问者并没有使用那个操作系统。