Windows 8 视窗-8及;Internet Explorer-10破坏了我的ActiveX控件绘图?

Windows 8 视窗-8及;Internet Explorer-10破坏了我的ActiveX控件绘图?,windows-8,activex,windbg,internet-explorer-10,Windows 8,Activex,Windbg,Internet Explorer 10,在“Windows 8”操作系统和浏览器“Microsoft Internet Explorer 10”上运行Active-X控件时,我遇到了一个非常奇怪的行为 控件: 我的Active-X control是一款非常稳定的产品,我的公司已经在数百名快乐的客户之间分销了几年。控件是一个ATL自定义绘图控件,用C++编写,并用“Visual Studio 2008”构建。p> 问题–图形消失: 当我第一次按下打开控件的链接时,我可以看到我的控件正在逐渐绘制(因为我的数据加载有时很慢),但最终所有的图

在“Windows 8”操作系统和浏览器“Microsoft Internet Explorer 10”上运行Active-X控件时,我遇到了一个非常奇怪的行为

控件: 我的Active-X control是一款非常稳定的产品,我的公司已经在数百名快乐的客户之间分销了几年。控件是一个ATL自定义绘图控件,用C++编写,并用“Visual Studio 2008”构建。p> 问题–图形消失: 当我第一次按下打开控件的链接时,我可以看到我的控件正在逐渐绘制(因为我的数据加载有时很慢),但最终所有的图形都消失了,在控件所在的位置留下一个空白的白色背景色

使用“Spy++”,我可以看到我的控件确实存在,但它的所有画面都消失了。 如果我移动浏览器或更改其大小,控件将被重新绘制,否则它将不可见

我试图调试这个问题,并找出谁正在删除我的绘图。 我想出了以下技巧:

  • 使用WinDBG,我在以下方法的“user32.dll”dll上添加了断点:user32!好的,用户32!无效,用户32!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
    
    这是一致的。 检查此堆栈时,我发现此消息属于
    internetexplorer\u Hidden
    类窗口,该窗口大小为
    0(0x0)
    ,但样式为
    WS\u VISIBLE
    。此窗口属于浏览器

    有人知道这种现象吗? 浏览器隐藏窗口是否可能导致此问题? 你能推荐另一种方法来寻找正在擦除我的绘图的堆栈吗

    谢谢你的提示

    Paz报价

    结论: 错误出现在
    Microsoft Internet Explorer 10

    我使用Microsoft支持服务来进一步调查这个问题。随函附上调查结果:

    Microsoft支持人员查看了my IE的版本(
    Internet Explorer
    ),并建议首先将IE升级到其最新补丁

    碰巧的是,我正在使用的机器在一段时间内没有设置为由
    Windows Update
    服务自动更新。作为IE升级的一部分,我必须首先使用
    windows update
    服务将windows更新为其最新补丁

    Windows Update
    过程中,
    Microsoft Internet Explorer 10
    自动更新为其最新补丁。 IE更新后,问题就消失了。 此外,ActiveX GUI加载过程变得更快

    Microsoft Internet Explorer 10的旧版本导致了以下问题:

    • 版本:10.0.9200.16384
    • 更新版本:RTM(KB2718695)
    Microsoft Internet Explorer 10的新版本解决了以下问题:

    • 版本:10.0.9200.16635
    • 更新版本:10.0.7(KB2846071)
    现在一切都如期进行


    谢谢,Pazo

    这是GDI句柄泄漏的常见迹象,这是一个可能长时间未被发现的错误。我不确定GDI句柄泄漏是否与此问题有关,因为(a)问题发生在我第一次启动浏览器并打开AXCtrl时,以及(b)在这一阶段,整个IE过程中GDI对象的总数大约为70个,这听起来并不多(除非我遗漏了什么)。好吧,这表明我们没有好的方法为您调试代码。如果您自己无法调试,请使用Microsoft支持。