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

posted on 2013-08-30 17:03  金山野狼  阅读(708)  评论(0编辑  收藏  举报