Win32Exception:操作成功完成

时间:2011-12-11 16:19:33

标签: c# wpf exception

以下代码崩溃并出现异常:

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对象无关。

2 个答案:

答案 0 :(得分:8)

它不会弹出winapi错误代码,实际错误代码是E_FAIL,一个COM错误代码。这对于诊断任何东西都是无益的,它并不意味着“不能做到,不知道为什么”。 GetDC()如何产生错误代码是非常难以猜测的,我怀疑它是环境与钩子winapi函数挂钩。也许类似于远程桌面或屏幕录像机。尝试在另一台机器上运行它。

GetDC()失败的“正常”原因是句柄泄漏。当Windows已经消耗了10,000个句柄时,它就会停止为进程提供更多句柄。您可以使用TaskMgr.exe,进程选项卡诊断的东西。查看+选择列并勾选句柄,用户对象和GDI对象。首先检查进程列表,并验证您没有消耗大量进程的进程。会话中所有进程的GDI对象总数受会话池大小的限制。接下来运行您的程序并密切关注您的过程的值。

答案 1 :(得分:0)

我们的项目也有这个问题......

我们将所有视图和视图模型堆叠起来,然后逐个显示它们。 解决方案是逐个显示元素而不进行堆栈。