我一直使用EmbeddedWebBrowser来做一个自己用的浏览器,不过发现在进入某些网站是浏览器卡死或崩溃,查看错误日之后发现基本都是Flash.ocx Active控件先产生异常,然后抛出Invalid floating point operation的错误,产生这种错误的网站基本上都是些视频网站,最典型的就是腾讯视频,对于这个异常的处理方法,一直没找到,直到最近看了园子里Eboy's blog的这篇文章
http://www.cnblogs.com/jxgxy/archive/2012/03/13/2394129.html
之后才找到解决问题的方法,按照上面的介绍,我在主窗体的Create事件中加入了代码:
Set8087CW(Longword($133f));
编译 运行 测试 问题依旧!
难道是这种办法是忽悠人的???
我的浏览器都是动态创建的,会不会是这个原因??我也在浏览的创建事件中加入了上面的代码,测试后发现问题依旧,无奈之下突然想起了谷歌,于是随便搜了一下,结果发现了这个:
http://stackoverflow.com/questions/8200581/twebbrowser-crashes-with-embedded-youtube-clips
function Get8087CW: Word; // for D5 asm PUSH 0 FNSTCW [ESP].Word POP EAX end; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled := False; Timer1.Interval := 5000; // 5 sec Saved8087CW := Get8087CW; end; procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool); begin Timer1.Enabled := False; System.Set8087CW($133F); // Disable all fpu exceptions end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; Set8087CW(Saved8087CW); end;
得到这个答案后,我立即在WebBrowser的WebBrowser1BeforeNavigate2事件中加入了
Set8087CW($133F);
并未按照原帖的方法处理,神奇的事情发生了,这个问题居然解决了。
看了看原帖,原来只是强制关闭了FPU 浮点错误
后继测试还表明,这种关闭并不完全,有时还是会抛出Invalid floating point operation异常的,不过问题已经得到解决了!