我最近将我的应用程序从Delphi 2007升级到Delphi XE8。在几种形式中,Form.showmodel行抛出“浮点除零”异常。在那些表格上根本没有进行算术运算。
我尝试在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。我打开了这个项目,这个问题又开始出现了,但这一次,即使我写了上面的代码,它仍然会抛出异常。
有没有人看到这样的问题,有人可以说明这个问题的可能原因吗?
答案 0 :(得分:0)
您使用的是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($133F);
DoYourComOperationHere;
Set8087CW(Saved8087CW);
end;