关于TWebBrowser.Document
也许很多人用过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; 问题点数:100、回复次数:17 Top 1 楼postren(小虫【宝宝出生,真忙】)回复于 2006-09-20 15:43:35 得分 10听说TWebBrowser是有这个问题,没听说过解决办法 Top 2 楼CrazyRobber(疯狂强盗)回复于 2006-09-21 09:05:22 得分 0 但是,问题总是要解决的呀,要不,指点一些绝招,用控件以外的其它办法解决。 Top 3 楼postren(小虫【宝宝出生,真忙】)回复于 2006-09-21 09:30:10 得分 0 参考一下这个,不知道能否有效 http://support.microsoft.com/kb/893629/en-us Top 4 楼CrazyRobber(疯狂强盗)回复于 2006-09-21 10:20:10 得分 0 to: postren(小虫) 看了一下,还是不知道怎么做,可能是我英文水平太低了吧,最后一句: If you try to replace that interface by using the ICustomDoc interface, you may experience unexpected behavior. 不知什么意思,是不是用ICustomDoc就能解决呢?如果用ICustomDoc,又怎么做呢,如何编程? 太底层了,不懂啊! Top 5 楼CrazyRobber(疯狂强盗)回复于 2006-09-22 08:36:18 得分 0 Up! Help! Up! Top 6 楼CrazyRobber(疯狂强盗)回复于 2006-09-27 17:55:41 得分 0 问题还未解决,帮忙想想吧 Top 7 楼delgyi(孑然)回复于 2006-10-08 14:42:31 得分 2同样的问题,我也顶下。我的现象是同时引用了INDY的IdComponent, IdHTTP这2个单元后,再访问Document就会出现这个问题。 Top 8 楼CrazyRobber(疯狂强盗)回复于 2006-10-09 09:23:50 得分 0 有些人说是IE有内存泄漏漏洞,而且早已发现,但MicroSoft一直没有相关的解释和补丁,新版的IE也一样存在这个问题,真想不明白。 或者,还是我们使用不当,是不是要显式地手工释放内存?又如何做? Top 9 楼halfdream(哈欠)回复于 2006-10-11 11:06:29 得分 5 根据程序运行时观察VCL的内存管理器,它分配的内存并没有增加. 显然MS的WEBBROWSER内部分配的问题,而且有WINDOWS句柄未释放现象. 确实是麻烦的问题,继续关注 Top 10 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-11 13:00:46 得分 0 楼主,中文版的网址: http://support.microsoft.com/kb/893629/zh-cn Top 11 楼CrazyRobber(疯狂强盗)回复于 2006-10-14 14:03:02 得分 0 to: halfdream(哈欠) 谢谢关注! to: agui(阿贵: 高级图形用户界面) 这个网址我上过,可是看不懂,英文版的也看过了,也看不懂,不知怎么解决,能讲解一下吗?(请原谅我的愚钝) Top 12 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-10-16 11:20:25 得分 0 解决方法是用一个守护进程定时重新启动程序 浏览器控件会保存页面状态,这对需要回退到上一个页面的用户很有效,但是对程序来说并无意义。 另外,javascipt引擎的垃圾回收机制也可能会造成自动浏览时内存占用不断上升。 Top 13 楼CrazyRobber(疯狂强盗)回复于 2006-10-16 17:08:35 得分 0 to: jiangsheng(蒋晟.Net[MVP]) 难道要我的程序运行一段时间自动重启?这样客户看来不会太满意吧! 不过,这不失为一个大胆有创意的想法。如果能找出哪一块内存是被无故占用的,想办法释放掉,应该也可以的。只是,我不会做啊。 Top 14 楼agui(阿贵: 高级图形用户界面)回复于 2006-10-16 18:37:57 得分 80楼主:它的意思只是说使用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