我在“Windows 8”操作系统和浏览器“Microsoft Internet-Explorer 10”上运行Active-X控件时遇到了非常奇怪的行为。Windows-8和Internet Explorer-10打破了我的ActiveX控件绘图?
控件: 我的Active-X控件是非常稳定的产品,我公司已经在数百个快乐客户之间分发了好几年了。该控件是用C++编写的ATL自定义绘图控件,并使用“Visual Studio 2008”构建。
问题 - 绘图消失: 虽然我按下第一次打开控件的链接,但我可以看到我的控件逐渐被绘制(因为我的数据加载有时很慢),但最终所有图形消失,在控件所在的位置留下空白的白色背景颜色。
使用'Spy ++'我可以看到我的控制真的存在,但是它的所有绘画都消失了。 如果我移动浏览器或更改其大小,控件将被重新绘制,但除此之外它根本不可见。
我试图调试这个问题,并找出谁在擦除我的图纸。 我想出了以下技术:
- 使用的WinDBG我加断点在以下方法 'user32.dll中' DLL:!!!InvalidateRect USER32,USER32 InvalidateRgn,USER32 FillRect,
- 我定义了这些方法只显示栈,并继续运行,
- 我跑了上述问题的情况下,
- 当问题发生,我想查看谁被称为“的Invalidate”或“FillRect”,
- 由于这一切发生很快,我正在使用'Print Scr EEN”按钮可冻结时刻
正好在我的控制消失下面的堆栈呼叫的时间做这几次我发现后‘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
这是一致的。 检查此堆栈时,我发现此消息属于类Internet Explorer_Hidden
的窗口,该窗口的大小为zero (0x0)
,但窗口的样式为WS_VISIBLE
。该窗口属于浏览器。
有没有人知道这种现象? 浏览器隐藏窗口是否有可能导致此问题? 你可以推荐其他方法来尝试和寻找删除我的绘图的堆栈吗?
非常感谢您的任何提示!
拉巴斯发售
这是GDI手柄泄漏的常见迹象,这是一个长期未被发现的bug。 –
我不确定泄漏GDI句柄是否与此问题有关,因为(a)当我第一次启动浏览器并打开我的AXCtrl时,问题发生,并且(b)此阶段的GDI对象总数是整个IE过程大约70个,听起来不太好(除非我错过了一些东西)。 – PazO
好吧,以此为标志,我们没有好的方法来为您调试代码。如果您无法自己调试,请使用Microsoft支持。 –