Программа MFC зависает: сломанный Comctl32.dll после обновления KB3059317 на Vista?

У меня есть программа, основанная на MFC, которая работала нормально перед применением обновления 3059317:

MS15-060: Уязвимость в общих элементах управления Microsoft делает возможным удаленное выполнение кода: 9 июня 2015 г.)

Обновление заменяет Comctl32.dll с новой версией.

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

Я понятия не имею, как я мог бы попытаться отладить эту проблему, чтобы найти способ обойти ее. Создание дампа памяти при зависании программы дает следующую трассировку стека:

comctl32.dll!751f8505()
Xxx.exe!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2095 + 0x13 bytes
Xxx.exe!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 285
Xxxx.exe!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 434 + 0x10 bytes
user32.dll!76aafd72()
user32.dll!76aa84de()
user32.dll!76aafd72()
user32.dll!76aa9f8d()
ntdll.dll!77dd5a7e()
user32.dll!76aaa2af()
comctl32.dll!75249cfb()
comctl32.dll!751fb559()
user32.dll!76aafd72()
user32.dll!76aafe4a()
user32.dll!76ab09d3()
user32.dll!76abb759()
Xxx.exe!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1116 + 0x7 bytes
Xxx.exe!CWnd::Default() Line 315 + 0x13 bytes
Xxx.exe!CParsedEdit::OnPaint() Line 1603
Xxx.exe!CBannerEdit::OnPaint() Line 368

Так что мы действительно застряли в Comctl32.dll — что теперь?

Кстати, в некоторых случаях удаление обновления решает проблему.

ОБНОВИТЬ

Во всех случаях отключение Aero всегда решает проблему. А KB3059317 кажется
не будет единственным обновлением в июне 2015 года для Windows Vista, которое демонстрирует это
странное поведение.

5

Решение

Это не удается с Areo Vista, по крайней мере, для одного диалога в нашем приложении: диалог просто не окрашен. Это присутствует, но это просто не видно.

Чтобы решить проблему в Vista Aero, удалите все вызовы SetRedraw() функция при выполнении OnInitDialog() а также OnSize() методы.

Кажется, что SetRedraw(TRUE) не имеет (положительного) эффекта, по крайней мере, в этих двух случаях.

2

Другие решения

У меня та же проблема с пользовательской программой, написанной на .NET 4, которая использует настроенную версию элемента управления ListView. Программа не зависает, выдает сообщение об ошибке «Попытка чтения или записи защищенной памяти. Это часто свидетельствует о повреждении другой памяти». После удаления этого обновления все в порядке.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector