让一个GDI泄漏的应用程序最终会遇到10,000个已分配的GDI对象并崩溃。我尝试将GDIProcessHandleQuota增加到20,000,但程序在达到10,000个对象时仍然崩溃。我们目前正在努力修补此漏洞,但出于好奇 - 是否有办法增加单个流程的GDI限制?或者10k是个人申请的硬限制?
答案 0 :(得分:15)
10K是一个硬限制。
GDI对象表示图形设备界面资源,如字体,位图,画笔,笔和设备上下文(绘图表面)。与USER对象一样,窗口管理器将进程限制为最多10,000个GDI对象 [...]
Mark Russinovich有一系列文章深入探讨了Windows中的各种限制。您可能会发现这两个有用:
Raymond Chen的另一篇好文章:
答案 1 :(得分:6)
有一个可行的解决方案。我在这里处理一个行为不端的供应商的应用程序,它分配了大量的GDI对象,这个解决方案允许它在大多数时间工作......
待办事项
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows
查找SharedSection=
,其中应该是以逗号分隔的3个数字。将中间数一次增加1024,看看是否能解决您的问题。您正在使用此变量控制“桌面堆”的数量,这在过去允许我运行行为不端的GDI。
请查看KB184802了解更多信息。搜索SharedSection以查找页面的相关部分。
答案 2 :(得分:0)
我可以通过仅更改GDIProcessHandleQuota将我的GDI对象从10000增加到15000,但这需要重启才能生效。我没有必要更改我的SharedSection值,只需要重新启动。
虽然10000看起来像一个大数字,但我的应用程序有一个大的UI,有很多按钮,画笔,图像,图标等。一旦应用程序启动,对象的数量只会增加,如果用户做了一些值得的东西增加。没有GDI对象从应用程序中泄漏。为了测试我的解决方案,我确实添加了一个“泄漏”方法,因此我可以在任务管理器中观察当GDI对象的数量超出各种限制时发生了什么。