在“Windows 8”操作系统和浏览器“Microsoft Internet-Explorer 10”上运行我的 Active-X 控件时,我遇到了一种非常奇怪的行为。
控件:我的 Active-X 控件是非常稳定的产品,我的公司已经在数百名满意的客户之间分发了几年。该控件是一个 ATL 自定义绘制控件,用 C++ 编写,并使用“Visual Studio 2008”构建。
问题 - 绘图消失:当我第一次按下打开控件的链接时,我可以看到我的控件正在逐渐绘制(因为我的数据加载有时很慢),但最终所有绘图都消失了,留下一个控件所在的空白背景颜色。
使用“Spy++”我可以看到我的控件确实在那里,但它的所有绘画都消失了。如果我移动浏览器或更改其大小,控件将被重新绘制,否则它根本不可见。
我试图调试这个问题并找出谁在擦除我的绘图。我想出了以下技术:
- 使用 WinDBG,我在以下方法的“user32.dll”DLL 处添加了断点:user32!InvalidateRect、user32!InvalidateRgn、user32!FillRect、
- 我将这些方法定义为仅显示堆栈并继续运行,
- 我运行了上述有问题的场景,
- 当问题发生时,我试图查看谁调用了“Invalidate”或“FillRect”,
- 由于这一切发生得非常快,我正在使用“打印屏幕”按钮来冻结这一刻
这样做几次后,我发现正是在我的控件消失时,以下堆栈调用'user32!FillRect':
user32!FillRect
MSHTML!memcpy+0x9805
MSHTML!COmWindowProxy::SwitchMarkup+0x468
MSHTML!CMarkup::SetInteractiveInternal+0x428
MSHTML!CMarkup::RequestReadystateInteractive+0x98
MSHTML!CMarkup::BlockScriptExecutionHelper+0xde
MSHTML!CHtmPost::Exec+0x794
MSHTML!CHtmPost::Run+0x1c
MSHTML!PostManExecute+0x5f
MSHTML!PostManResume+0x7b
MSHTML!CHtmPost::OnDwnChanCallback+0x3a
MSHTML!CDwnChan::OnMethodCall+0x19
MSHTML!GlobalWndOnMethodCall+0x169
MSHTML!GlobalWndProc+0xd7
user32!InternalCallWinProc+0x23
user32!UserCallWinProcCheckWow+0x100
user32!DispatchMessageWorker+0x3ef
user32!DispatchMessageW+0x10
IEFRAME!CTabWindow::_TabWindowThreadProc+0x981
IEFRAME!LCIETab_ThreadProc+0x378
iertutil!CIsoWinMsg::PostQueuedMessagesToComponent+0x4b
IEShims!NS_CreateThread::DesktopIE_ThreadProc+0x66
KERNEL32!BaseThreadInitThunk+0xe
ntdll!__RtlUserThreadStart+0x72
ntdll!_RtlUserThreadStart+0x1b
这是一致的。在检查此堆栈时,我发现此消息属于 class 的窗口Internet Explorer_Hidden
,它是大小的窗口zero (0x0)
,但具有WS_VISIBLE
样式。这个窗口属于浏览器。
有谁知道这个现象?浏览器隐藏窗口是否可能导致此问题?您能否推荐其他方法来尝试寻找正在擦除我的绘图的堆栈?
非常感谢任何提示!
帕兹优惠