showmodal Delphi XE8上的浮点除零

showmodal Delphi XE8上的浮点除零,delphi,floating-point,delphi-xe8,divide-by-zero,Delphi,Floating Point,Delphi Xe8,Divide By Zero,我最近将我的应用程序从Delphi2007升级到DelphiXE8。在两种形式中,Form.showmodel行抛出“浮点除零”异常。在这些表格上根本没有算术运算 在showmodel解决问题之前,我尝试执行以下代码 var CW, SW: word; function GetX87CW: word; ASM FStCW [Result] End; Function GetX87SW: word; // Assembler; ASM FSt

我最近将我的应用程序从Delphi2007升级到DelphiXE8。在两种形式中,Form.showmodel行抛出“浮点除零”异常。在这些表格上根本没有算术运算

在showmodel解决问题之前,我尝试执行以下代码

  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并重新启动了XE8IDE。我打开了项目,这个问题再次出现,但这次,尽管我写了上面的代码,它仍然抛出异常


有人看到过这样的问题吗?有人能解释一下问题的可能原因吗?

您是否使用COM对象,例如调用.Net程序集?还是OpenGL?或者一些OleDB/ADO提供程序?还有其他外部的.dll吗?我想是的

听起来像。您应该通过保存和恢复每次调用的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;

你没有提供足够的信息。你的表格在做什么?这样的问题在普通的Delphi应用程序中永远不会出现。此表单中没有任何内容是非标准的、COM甚至Windows API。它有两个用于数据库访问的Tlistview和TADODataset。非常奇怪的是,它可以在Delphi2007上运行,但不能在Delphi XE8上运行。毫无疑问,如果没有@DivX,ADO是基于COM的。请看我的答案。是的,我同意ADO是基于COM的,但XE8上的TADODataset是embarcadero编写的,因此我希望它能与Delphi 2007一样工作,因为使用XE 8编译的同一个项目会引发此异常。不过请注意,Set8087CW不是线程安全的,因此,如果有多个线程调用Set8087CW,则无法使用此方法这个答案解决了问题,但我担心这个问题的影响可能会非常大,因为我所有的项目都使用ADO,此时更改ADO对我来说不是一个选项。这只发生在两个表单上,因此我将进一步分析为什么它只发生在少数表单上,因为所有表单都使用ADO。