也许很多人用过TWebBrowser。
我今天才发现,仅仅用TWebBrowser.Navigate(FileName);没有什么问题。
但,当我程序代码中涉及到TWebBrowser.Document时,哪怕是什么都不做,当TWebBrowser控件Free后,不能完整地释放内存。当我的程序中多次创建和释放该控件后,程序占用的内存会一直增加,直至系统崩溃!
请教各位,如何解决这个问题?!procedure TForm1.Timer1Timer(Sender: TObject);
begin
  DelOld;
  CrtNew;
end;procedure TForm1.CrtNew;
begin
  Browser := TWebBrowser.Create(Self);
  TWinControl(Browser).Parent := Self;
  Browser.Left := 88;
  Browser.Top := 8;
  Browser.Width := ClientWidth - 96;
  Browser.Height := ClientHeight - 16;
  Browser.Navigate(FileName);
end;procedure TForm1.DelOld;
var
  doc2: IHTMLDocument2;
begin
  if Assigned(Browser) then
  begin
    doc2 := Browser.Document as IHTMLDocument2; //将此类语句放到其它地方也一样,但没了这类语句,就一切正常。
//  Browser.Document; //甚至改成这样也一样会不能释放内存
    Browser.Free;
  end;
end;

解决方案 »

  1.   

    听说TWebBrowser是有这个问题,没听说过解决办法
      

  2.   

    参考一下这个,不知道能否有效
    http://support.microsoft.com/kb/893629/en-us
      

  3.   

    to: postren(小虫) 
    看了一下,还是不知道怎么做,可能是我英文水平太低了吧,最后一句:
    If you try to replace that interface by using the ICustomDoc interface, you may experience unexpected behavior.
    不知什么意思,是不是用ICustomDoc就能解决呢?如果用ICustomDoc,又怎么做呢,如何编程?
    太底层了,不懂啊!
      

  4.   

    同样的问题,我也顶下。我的现象是同时引用了INDY的IdComponent, IdHTTP这2个单元后,再访问Document就会出现这个问题。
      

  5.   

    有些人说是IE有内存泄漏漏洞,而且早已发现,但MicroSoft一直没有相关的解释和补丁,新版的IE也一样存在这个问题,真想不明白。
    或者,还是我们使用不当,是不是要显式地手工释放内存?又如何做?
      

  6.   


    根据程序运行时观察VCL的内存管理器,它分配的内存并没有增加. 显然MS的WEBBROWSER内部分配的问题,而且有WINDOWS句柄未释放现象.确实是麻烦的问题,继续关注
      

  7.   

    楼主,中文版的网址: http://support.microsoft.com/kb/893629/zh-cn
      

  8.   

    to: halfdream(哈欠) 
      谢谢关注!to: agui(阿贵: 高级图形用户界面)
      这个网址我上过,可是看不懂,英文版的也看过了,也看不懂,不知怎么解决,能讲解一下吗?(请原谅我的愚钝)
      

  9.   

    解决方法是用一个守护进程定时重新启动程序
    浏览器控件会保存页面状态,这对需要回退到上一个页面的用户很有效,但是对程序来说并无意义。
    另外,javascipt引擎的垃圾回收机制也可能会造成自动浏览时内存占用不断上升。
      

  10.   

    to: jiangsheng(蒋晟.Net[MVP]) 
     难道要我的程序运行一段时间自动重启?这样客户看来不会太满意吧!
     不过,这不失为一个大胆有创意的想法。如果能找出哪一块内存是被无故占用的,想办法释放掉,应该也可以的。只是,我不会做啊。
      

  11.   

    楼主:它的意思只是说使用ICustomDoc可能会导致一些意想不到的事情,不知道是不是跟使用TWebBrowser.Document有关系。我这里确实重现了楼主的问题,但这个问题涉及到WebBrowser的内部,我觉得追根究底会需要比较多的精力,所以我只说怎么避免这个问题。可以这样来取得IHTMLDocument2对象而没有内存泄露问题:
    var
      doc2: IHTMLDocument2;
      intf: IWebBrowser2;// code片段
        intf := Browser.DefaultInterface;
        doc2 := intf.Document as IHTMLDocument2;
        // 取得HTML体的文本(注意:innerText不W3C标准,是微软/IE自己的)
        Memo1.Text := doc2.body.innerText;另外,我建议在执行其它的语句前,先等WebBrowser喘口气,否则有时候会报错:
      Browser.Navigate('http://www.agui.googlepages.com');
      while Browser.Busy do
        Application.ProcessMessages;
    --
    http://www.agui.googlepages.com
    mailto: agui.cn(a)gmail.com
      

  12.   

    try to use SetProcessWorkingSetSizeEx to force a garbage collection.
      

  13.   

    to: agui(阿贵: 高级图形用户界面) 
     你的办法确实很有效,试了一个小时,内存占用情况比原来的大大减少,但是,仍然会有少量的内存占用增加,只是慢了很多,不注意看一下还看不出。如果没有其它更好的办法,看来只能这样了。谢谢你了。to: jiangsheng(蒋晟.Net[MVP]) 
     这个函数还不知道怎么用,还要仔细研究研究,看看能不能帮助解决这个问题。谢谢