簡體   English   中英

Win32Exception:操作成功完成

[英]Win32Exception: Operation completed successfully

以下代碼崩潰,但有異常:

MyWindow wnd = new MyWindow();
wnd.Show(); //here an exception occurs

異常是相當奇怪的,但據我所知,它是.net中的一個錯誤

System.ComponentModel.Win32Exception (0x80004005): The operation completed successfully
   at MS.Win32.UnsafeNativeMethods.GetDC(HandleRef hWnd)
   at System.Windows.Interop.HwndTarget..ctor(IntPtr hwnd)
   at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   at System.Windows.Interop.HwndSource..ctor(HwndSourceParameters parameters)
   at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()

MyWindow對象是一個內部有一些矢量圖形的窗口,但不是太多。 此外,它已經在10-20個MyWindow對象已經打開和關閉時發生。

解決方案:原因是GDI對象泄漏。他們在我的低級代碼中創建包含錯誤。 所以,問題與MyWindow對象無關。

它不會彈出一個winapi錯誤代碼,實際的錯誤代碼是E_FAIL,一個COM錯誤代碼。 這對於診斷任何東西都是無益的,它並不意味着“不能做到,不知道為什么”。 GetDC()如何產生錯誤代碼是非常難以猜測的,我懷疑它是環境與鈎子winapi函數掛鈎。 也許類似於遠程桌面或屏幕錄像機。 嘗試在另一台機器上運行它。

GetDC()失敗的“正常”原因是句柄泄漏。 當Windows已經消耗了10,000個句柄時,它就會停止為進程提供更多句柄。 您可以使用TaskMgr.exe,進程選項卡診斷的東西。 查看+選擇列並勾選句柄,用戶對象和GDI對象。 首先檢查進程列表,並驗證您沒有消耗大量進程的進程。 會話中所有進程的GDI對象總數受會話池大小的限制。 接下來運行您的程序並密切關注您的過程的值。

我們的項目也有這個問題......

我們將所有視圖和視圖模型堆疊起來,然后逐個顯示它們。 解決方案是逐個顯示元素而不進行堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM