MFC 程序挂起:在 Vista 上更新 KB3059317 后 Comctl32.dll 损坏?

Posted

技术标签:

【中文标题】MFC 程序挂起:在 Vista 上更新 KB3059317 后 Comctl32.dll 损坏?【英文标题】:MFC program hangs: broken Comctl32.dll after update KB3059317 on Vista? 【发布时间】:2015-06-17 06:22:16 【问题描述】:

我有一个基于 MFC 的程序,它在应用更新 3059317 之前运行良好:

MS15-060:Microsoft 公共控件中的漏洞可能允许远程执行代码:2015 年 6 月 9 日)

更新将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 进行的更新,其中展示了这一点 奇怪的行为。

【问题讨论】:

CWnd::WindowProcthis指向什么? messagewParamlParam的值是多少? 由于该更新,我的系统上也有一些应用程序崩溃了。 【参考方案1】:

至少对于我们应用程序中的一个对话框,它在 Areo Vista 上失败了:对话框只是没有绘制。它存在,但只是不可见。

要解决 Vista Aero 上的问题,请在执行 OnInitDialog()OnSize() 方法时删除对 SetRedraw() 函数的所有调用。

似乎SetRedraw(TRUE) 没有(积极的)影响,至少在这两种情况下。

【讨论】:

【参考方案2】:

我有一个用 .NET 4 编写的自定义程序,它使用自定义版本的 ListView 控件。该程序不会挂起它会产生错误“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”。卸载此更新后一切正常。

【讨论】:

以上是关于MFC 程序挂起:在 Vista 上更新 KB3059317 后 Comctl32.dll 损坏?的主要内容,如果未能解决你的问题,请参考以下文章

某些数据处理时 MFC 应用程序 gui 挂起

MFC 应用程序中的“仅 Vista”堆损坏

C++/MFC - 防止挂起的子 (ActiveX) 控件冻结整个 UI?

程序无法在 Vista 和 Server 2008 上运行

如何使用 MFC 创建类似于 Vista 的扩展按钮?

MFC 应用程序在 CSingleLock Lock() 后挂起