注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【▲▲▲▲▲】IE8,WebBrowser的Document操作导致严重的内存泄露和死线程!!!  

2011-10-05 14:56:00|  分类: Windows系统BUG搜 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
IE中的内存严重泄露!大量死线程无法被回收!——不知道是我的方法不对,还是微软IE的BUG。

问题重现步骤如下:
1. 创建一个MFC对话框应用程序
2. 在对话框资源中,插入一个WebBrowser控件
3. 给WebBrowser控件加入一个关联变量
4. 使用下面的函数设置网页内容:

int g_ShowHtml(CWebBrowser2 & browser, LPCTSTR pbuffer)
{
    CComPtr<IHTMLDocument2> pHTMLDocument;
    CComPtr<IDispatch> pDispatch;
    pDispatch=browser.get_Document();
    pHTMLDocument=pDispatch;

    if (pHTMLDocument==NULL)//m_pHtmlView是CHtmlView或者WebBrowser
    {
        browser.Navigate(DEFAULT_IE_NULL, NULL, NULL, NULL, NULL);

        pDispatch=browser.get_Document();
        pHTMLDocument=pDispatch;
        if (pHTMLDocument==NULL)
        {
            return -1;
        }
    }

    return g_ShowHtml(pHTMLDocument, pbuffer);
}


int g_ShowHtml(IHTMLDocument2 *pHTMLDocument, LPCTSTR pbuffer)
{
    CComPtr<IPersistStreamInit> pPSI;

    CComPtr<IStream> pStream;
    HGLOBAL hHTMLText;

    if (FAILED(pHTMLDocument->QueryInterface(&pPSI)))
    {
        return -1;
    }

    pHTMLDocument->clear();
    pPSI->InitNew();

    DWORD dwLength=0;
    ULARGE_INTEGER libNewSize={0};

    dwLength=sizeof(TCHAR)*(_tcslen(pbuffer)+1);
    hHTMLText = GlobalAlloc(GMEM_FIXED, dwLength);
    memset(hHTMLText, 0, dwLength);
    memcpy(hHTMLText, pbuffer, dwLength);
    CreateStreamOnHGlobal(hHTMLText, TRUE, &pStream);
    libNewSize.QuadPart = dwLength;
    pStream->SetSize(libNewSize);
    pPSI->Load(pStream);

    return 0;
}

其中,网页内容为:
<html>
<body>
    
<script language="javascript">
    var ele=document.body;
    ele.innerHTML='\
<object \
\
width=\"300\" \
height=\"100\" \
classid=\"clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6\" \
codebase=\"http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715\" \
standby=\"Loading Microsoft Windows Media Player components...\" \
type=\"application/x-oleobject\" \
hspace=\"0\"\
vspace=\"0\"\>\
<param name=\"URL\" value=\"f:\\midi\\music.mid\"\>\
<param name=\"AutoStart\" value=\"1\"\>\
<param name=\"volume\" value=\"100\"\>\
<param name=\"EnableContextMenu\" value=\"1\"\>\
<param name=\"CONTROLS\" value=\"ImageWindow\"\>\
</object\>\
\
';

</script>

</body>
</html>

5. 销毁WebBrowser控件,重新创建WebBrowser控件,重新按步骤4设置网页内容。不断重复此操作,进程线程数不断增加,直至1000多个线程的时候,步骤4将操作失败。
    此过程中,线程数应该维持不变,内存使用量应该基本上不变化。但是,实际上,线程数不断增加,并且内存耗用也大量增加(没有回收)。  

本人同时使用了另外几种方法设置Document内容,同样存在内存泄露和死线程问题。

By:章永辉
  评论这张
 
阅读(1722)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016