GDIリークのあるアプリケーションがあり、最終的に10,000個の割り当てられたGDIオブジェクトにヒットし、クラッシュします。 GDIProcessHandleQuota を20,000に増やしてみましたが、10,000オブジェクトに達したときにプログラムがクラッシュしました。現在、このリークのパッチ適用に取り組んでいますが、好奇心から、単一プロセスのGDI制限を増やす方法はありますか?それとも、10kは個々のアプリケーションの厳しい制限ですか?
うまくいくかもしれない解決策があります。ここでは、大量のGDIオブジェクトを割り当てる、動作に問題のあるベンダーのアプリを扱います。このソリューションを使用すると、ほとんどの場合に機能します...
行う
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems" /v windows
探す SharedSection=
これはコンマで区切られた3つの数字でなければなりません。中央の数値を一度に1024ずつ増やして、問題が解決するかどうかを確認します。この変数を使用して「デスクトップヒープ」の量を制御しているため、過去に不正な動作をすることができましたGDI)。
もう少し詳しくは KB184802 をご覧ください。 SharedSectionを検索して、ページの関連部分を見つけます。
10Kは厳しい制限です。
GDIオブジェクトは、フォント、ビットマップ、ブラシ、ペン、デバイスコンテキスト(描画面)などのグラフィカルデバイスインターフェイスリソースを表します。 USERオブジェクトの場合と同様に、ウィンドウマネージャーはプロセスを最大10,000に制限しますGDIオブジェクト[...]
Mark Russinovichには、Windowsのさまざまな制限について詳しく説明した一連の記事があります。次の2つが役立つ場合があります。
レイモンドチェンからの別の良い記事:
GDIProcessHandleQuotaのみを変更することで、GDIオブジェクトを10000から15000に増やすことができますが、これを有効にするには再起動が必要です。SharedSection値を変更する必要はなく、再起動のみが行われました。必須。
10000は大きな数字のように見えますが、私のアプリケーションには、ボタン、ブラシ、画像、アイコンなどがたくさんある大きなUIがあります。アプリケーションが起動すると、オブジェクトの数は、ユーザーが増加に値する何かをした場合にのみ増加します。いいえGDIオブジェクトがアプリケーションからリークしています。ソリューションをテストするために「リーク」メソッドを追加したので、タスクマネージャーでGDIオブジェクトがさまざまな制限を超えて増加しました。