Win32Exception: операция успешно завершена - PullRequest
4 голосов
/ 11 декабря 2011

Сбой следующего кода за исключением:

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 ]

8 голосов
/ 11 декабря 2011

Он не бомбит код ошибки winapi, фактический код ошибки - E_FAIL, код ошибки COM. Который очень бесполезен для диагностики чего-либо, это не означает ничего больше, чем «не мог сделать, не знаю почему». О том, как GetDC () может генерировать этот код ошибки, очень трудно догадаться, я подозреваю, что это связано с чем-то, перехватывающим функцию winapi Возможно, что-то похожее на удаленный рабочий стол или рекордер экрана. Попробуйте запустить это на другом компьютере.

«Нормальная» причина сбоя GetDC () - утечка дескриптора. Windows перестает давать процессу больше дескрипторов, когда она уже израсходовала 10 000. Что-то, что вы можете диагностировать с помощью TaskMgr.exe, вкладка «Процессы». Просмотр + Выбор столбцов и отметьте маркеры, объекты пользователя и объекты GDI. Сначала проверьте список процессов и убедитесь, что у вас нет процесса, который потребляет их много. Общее количество объектов GDI для всех процессов в сеансе ограничено размером пула сеансов. Затем запустите вашу программу и следите за значениями для вашего процесса.

0 голосов
/ 31 января 2013

У нас тоже есть эта проблема в нашем проекте ...

мы складывали все модели представления и представления в стек, а затем показывали их одну за другой.Решением было показать элементы один за другим, не создавая стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...