Delphi XE2,TWebBrowser,浮点除以零
在Delphi 2010和Delphi 2007中,我在WebBrowserForenavigate/WebBrowserDocumentComplete上使用Set8087CW,以防止ActiveX中的FPU错误破坏我的应用程序 但无论如何,这在Delphi XE2中不起作用,至少在64位模式下是如此 当点击链接(任意)时,我得到“浮点除以零”。(最初将网站地址或内容加载到TWebBrowser中效果良好。)Delphi XE2,TWebBrowser,浮点除以零,delphi,64-bit,delphi-xe2,floating-point-exceptions,Delphi,64 Bit,Delphi Xe2,Floating Point Exceptions,在Delphi 2010和Delphi 2007中,我在WebBrowserForenavigate/WebBrowserDocumentComplete上使用Set8087CW,以防止ActiveX中的FPU错误破坏我的应用程序 但无论如何,这在Delphi XE2中不起作用,至少在64位模式下是如此 当点击链接(任意)时,我得到“浮点除以零”。(最初将网站地址或内容加载到TWebBrowser中效果良好。) 调用堆栈显示这种情况发生在system32\D3D10Warp.dll内部(可能由I
调用堆栈显示这种情况发生在system32\D3D10Warp.dll内部(可能由IE9使用),以响应TApplication.ProcessMessage(以及两者之间的一些???)您需要在64位上屏蔽SSE异常,因为64位代码通常使用SSE执行浮点运算 调用以更改SSE单元的控制状态。就我个人而言,我会继续屏蔽8087异常,因为64位代码完全可以自由使用8087单元,如果它愿意的话。调用web浏览器代码时要使用的magic MXCSR值是
$1F80
。这是MXCSR的默认Windows值
或者,您可以调用并传递ExalarithmeticExceptions
,以屏蔽所有异常。这些方便的方法将使您的代码更具可读性
如果您对只需要在x86下的8087和x64下的SSE上屏蔽异常感到满意,那么您可以调用。这将改变x86下的8087控制状态,改变x64下的SSE控制状态
如果我必须在设置整个控件状态或使用方便的方法仅更改状态的异常屏蔽部分之间进行选择,我将设置整个控件状态。这些ActiveX控件的编写假设您将使用MS工具并期望特定的FP控件状态。我会给这些控件提供它们期望的确切控制状态,然后在从控件返回执行时返回Delphi控制状态。文档说明():64位窗口上的Set8087CW:此控制字不控制浮点操作,因为SSE寄存器用于64位模式下的浮点,而不是FPU(浮点单元)。但是FPU仍然在64位模式下存在,因此SGet8087CW设置控制字的值,就像在32位模式下一样。@teran,是的,但那是什么
SGet8087CW
?@TLama是Set8087CW
的一个打字错误,复制自。@Tom还有SetMXCSR
。我的建议是同时使用该和Set8087CW
。32位和64位Windows都可以使用FPU和SSE操作,无论Delphi使用什么进行浮点操作。@Tom,很抱歉输入错误。我指的是FPU(不是FTP)。谢谢大家的帮助。我接受这个响应作为解决方案,因为它深入地解决了这个问题(我直接使用SetMXCSR进行了测试,它似乎也能工作。我已将我的代码更改为在旧代码的基础上使用它。)+1;谢谢,你介意我在博客上引用你的一些答案吗?@jeroenviertplaimers我一点也不介意。请便。