開發者常遇 GDI 物件耗盡導致介面錯亂、繪圖失敗、程式崩潰。本文基於 Windows 2000/2003 實測,深度剖析 GDI 物件管理機制:句柄表結構、進程配額、系統總量上限、登錄檔調整,並給出實測臨界值與最佳實務。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota自寫 check.exe 批量建立 HBRUSH,統計單進程與系統總 GDI 計數(GetGuiResources(hProcess, GR_GDIOBJECTS) + EnumProcesses 遍歷)。
| 限制層級 | Win2000 | Win2003 |
|---|---|---|
| 理論句柄空間 | 64K | 64K |
| 系統硬性句柄上限 | 16K | ~64K |
| 進程預設配額 | 10K (註冊表可調) | 10K (註冊表可調) |
| 進程實際可建立上限 | ~12K (GetGuiResources 回傳) | ~50K+ (視註冊表) |
| 系統總量臨界值 | ~15,900 | ~63,700 |
DeleteObject,DC 用完 ReleaseDC/DeleteDC,避免洩漏累積觸及配額。Process Explorer、GDIView 即時監控。GDIProcessHandleQuota 設超 15,000 (Win2000) 易導致系統不穩,建議 ≤ 12,000。Win2003 可適度放寬。GDI 物件耗盡非單一原因,乃 進程配額 (10K 預設) + 系統硬性上限 (16K/64K) + 系統總量臨界值 (~16K/~64K) 三重疊加。開發者應從「不洩漏、重用物件、監控計數」著手,配額調整僅作臨時緩解,不可過度依賴。
Windows NT 安全機制淺析:口令、檔案系統、Web 伺服器與 NTFS 分區防禦
移花接木:用新裝系統修復舊 Windows 2000 無法啟動,保留應用程式與資料
Cisco Secure ACS for Windows NT 空密碼漏洞:LDAP 驗證繞過與升級修補
Windows 內建事件檢視器:系統故障診斷的免費神器,搭配微軟 KB 與 EventID.net 秒解難題
Windows NT/2000/XP/2003 系統密碼遺忘?官方/第三方清除工具與 USB 開機實戰
Windows 系統故障手動修復指南:恢復雙開機選單、驅動程式回滾、系統檔案替換
ERD Commander 2003 解決 NT 系統啟動故障實戰:禁用錯誤驅動、恢復 NTLDR、查看事件日誌、系統還原