鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > delphi > >

EmbeddedWebBrowser网站报“Invalid floating point operation”

来源:互联网 作者:佚名 时间:2013-10-08 08:42
EmbeddedWebBrowser网站报“Invalid floating point operation”异常的解决方法 我一直使用EmbeddedWebBrowser来做一个自己用的浏览器,不过发现在进入某些网站是浏览器卡死或崩溃,查看错误日之后发现基本都是Flash.ocx Active控件先产生异常,然后抛出Inva

EmbeddedWebBrowser网站报“Invalid floating point operation”异常的解决方法

我一直使用EmbeddedWebBrowser来做一个自己用的浏览器,不过发现在进入某些网站是浏览器卡死或崩溃,查看错误日之后发现基本都是Flash.ocx Active控件先产生异常,然后抛出Invalid floating point operation的错误,产生这种错误的网站基本上都是些视频网站,最典型的就是腾讯视频,对于这个异常的处理方法,一直没找到,直到最近看了园子里Eboy's blog的这篇文章

之后才找到解决问题的方法,按照上面的介绍,我在主窗体的Create事件中加入了代码:

Set8087CW(Longword($133f));

编译 运行 测试 问题依旧!

难道是这种办法是忽悠人的???

我的浏览器都是动态创建的,会不会是这个原因??我也在浏览的创建事件中加入了上面的代码,测试后发现问题依旧,无奈之下突然想起了谷歌,于是随便搜了一下,结果发现了这个:

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异常的,不过问题已经得到解决了!

posted on

网友评论
<