私たちのプロダクションでは、私のアプリケーションは2つの異なる例外を引き起こしました:
System.ArgumentException: Invalid Parameter.
at System.Drawing.Image.get_RawFormat()
at System.Windows.Forms.ToolStripItem.set_Image(Image value)
at Zeiss.IMT.IME.CmmUI.Tools.ToolControl.updateControls()
同じ原因があると思われる別の例外があります。
System.ComponentModel.Win32Exception: The operation completed successfully
at System.Drawing.BufferedGraphicsContext.CreateCompatibleDIB(IntPtr hdc, IntPtr hpal, Int32 ulWidth, Int32 ulHeight, IntPtr& ppvBits)
at System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)
at System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.DataGridView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
両方の例外で、Windows タスク マネージャーは多数のハンドル (>8500) を表示します。そのため、ウィンドウ ハンドルの制限に達し、アプリケーションはより多くのメモリ/ハンドルを割り当てることができません。
これまでのところ、私は問題を理解しています。
この場合、System.Drawing を介して GDI 描画を多用しています。それで、グラフィックハンドルが解放されていないコードを検索しました-成功しませんでした。
問題は次のとおりです。
リリースされていない (ネイティブの) ハンドルを見つけるにはどうすればよいですか?