MFC 程序挂起:在 Vista 上更新 KB3059317 后损坏 Comctl32.dll?
MFC program hangs: broken Comctl32.dll after update KB3059317 on Vista?
我有一个基于 MFC 的程序,它在应用更新之前运行良好 3059317:
MS15-060: Vulnerability in Microsoft common controls could allow remote code execution: June 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 年 6 月对 Windows Vista 的唯一更新
奇怪的行为。
我在用 .NET 4 编写的自定义程序中遇到了同样的问题,该程序使用了自定义版本的 ListView 控件。该程序不会挂起并产生错误 "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."。卸载此更新后一切正常。
Areo Vista 在我们的应用程序中至少有一个对话框失败了:对话框只是没有绘制。它存在,但它只是不可见。
要解决 Vista Aero 上的问题,请在执行 OnInitDialog()
和 OnSize()
方法时删除对 SetRedraw()
函数的所有调用。
似乎SetRedraw(TRUE)
没有(正面)效果,至少在这两种情况下。
我有一个基于 MFC 的程序,它在应用更新之前运行良好 3059317:
MS15-060: Vulnerability in Microsoft common controls could allow remote code execution: June 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 年 6 月对 Windows Vista 的唯一更新 奇怪的行为。
我在用 .NET 4 编写的自定义程序中遇到了同样的问题,该程序使用了自定义版本的 ListView 控件。该程序不会挂起并产生错误 "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."。卸载此更新后一切正常。
Areo Vista 在我们的应用程序中至少有一个对话框失败了:对话框只是没有绘制。它存在,但它只是不可见。
要解决 Vista Aero 上的问题,请在执行 OnInitDialog()
和 OnSize()
方法时删除对 SetRedraw()
函数的所有调用。
似乎SetRedraw(TRUE)
没有(正面)效果,至少在这两种情况下。