showmodal Delphi XE8 上的浮点除以零
Floating point division by zero on showmodal Delphi XE8
我最近将我的应用程序从 Delphi 2007 升级到 Delphi XE8。在几种形式中,Form.showmodel 行抛出 "Floating point division by zero" 异常。在这些表格上根本没有进行任何算术运算。
我尝试在解决问题的 showmodal 之前执行以下代码。
var
CW, SW: word;
function GetX87CW: word;
ASM
FStCW [Result]
End;
Function GetX87SW: word; // Assembler;
ASM
FStSW [Result]
End;
CW := GetX87CW; SW := GetX87SW;
ShowMessage(Format('CW = $%4x, SW = $%4x',[CW,SW]));
我没有保存此代码并注释掉所有代码并再次重新编译也解决了问题的应用程序。
现在我关闭了 Delphi 并重新启动了 XE8 IDE。我打开项目,这个问题又开始出现了,但是这次,即使我写了上面的代码,它仍然抛出异常。
有没有人遇到过这样的问题,有人可以解释一下造成这种问题的可能原因吗?
您是否正在使用 COM 对象,例如调用 .Net 程序集?还是OpenGL?或者一些 OleDB/ADO 供应商?任何其他外部.dll?我想是的。
听起来像 this issue。您应该尝试通过为每个调用保存和恢复 FPU 异常标志来使外部非 Delphi 调用安全。
肯写道:
var
Saved8087CW: Word;
begin
Saved8087CW := Default8087CW;
// If you want, disable all fpu exceptions
// with the next line.
Set8087CW(3F);
DoYourComOperationHere;
Set8087CW(Saved8087CW);
end;
我最近将我的应用程序从 Delphi 2007 升级到 Delphi XE8。在几种形式中,Form.showmodel 行抛出 "Floating point division by zero" 异常。在这些表格上根本没有进行任何算术运算。
我尝试在解决问题的 showmodal 之前执行以下代码。
var
CW, SW: word;
function GetX87CW: word;
ASM
FStCW [Result]
End;
Function GetX87SW: word; // Assembler;
ASM
FStSW [Result]
End;
CW := GetX87CW; SW := GetX87SW;
ShowMessage(Format('CW = $%4x, SW = $%4x',[CW,SW]));
我没有保存此代码并注释掉所有代码并再次重新编译也解决了问题的应用程序。
现在我关闭了 Delphi 并重新启动了 XE8 IDE。我打开项目,这个问题又开始出现了,但是这次,即使我写了上面的代码,它仍然抛出异常。
有没有人遇到过这样的问题,有人可以解释一下造成这种问题的可能原因吗?
您是否正在使用 COM 对象,例如调用 .Net 程序集?还是OpenGL?或者一些 OleDB/ADO 供应商?任何其他外部.dll?我想是的。
听起来像 this issue。您应该尝试通过为每个调用保存和恢复 FPU 异常标志来使外部非 Delphi 调用安全。
肯写道:
var
Saved8087CW: Word;
begin
Saved8087CW := Default8087CW;
// If you want, disable all fpu exceptions
// with the next line.
Set8087CW(3F);
DoYourComOperationHere;
Set8087CW(Saved8087CW);
end;