5

Delphi2010およびDelphi2007では、WebBrowserBeforeNavigate / WebBrowserDocumentCompleteでSet8087CWを使用して、ActiveX内のFPUエラーがアプリケーションを機能不全にするのを防ぎます。

しかし、少なくとも64ビットモードでは、どういうわけかこれはDelphiXE2では機能しません。

リンク(任意)をクリックすると、「浮動小数点のゼロ除算」が表示されます。(WebサイトアドレスまたはコンテンツのTWebBrowserへの最初のロードは正常に機能します。)

コールスタックは、これがTApplication.ProcessMessage(および2つの間のいくつかの???)に応答してsystem32 \ D3D10Warp.dll(おそらくIE9によって使用されますか?)内で発生することを示しています

4

1 に答える 1

10

通常、64 ビット コードは SSE を使用して浮動小数点演算を実行するため、64 ビットでは SSE 例外をマスクする必要があります。

SetMXCSRSSE ユニットの制御状態を変更するために呼び出します。個人的には、8087 例外のマスキングを続けます。64 ビット コードは、必要に応じて 8087 ユニットを完全に自由に使用できるからです。Web ブラウザ コードを呼び出すときに使用するマジック MXCSR 値は$1F80. これは MXCSR のデフォルトの Windows 値です。

または、すべての例外をマスクするために呼び出しSetSSEExceptionMaskSetFPUExceptionMask渡すこともできます。exAllArithmeticExceptionsこれらの便利なメソッドにより、コードが読みやすくなります。

x86 では 8087 で例外を、x64 では SSE で例外をマスクするだけで十分な場合は、SetExceptionMask. これにより、x86 では 8087 制御状態が変更され、x64 では SSE 制御状態が変更されます。

コントロールの状態全体を設定するか、便利なメソッドを使用して状態の例外マスキング部分だけを変更するかを選択する必要がある場合は、コントロールの状態全体を設定します。これらの ActiveX コントロールは、MS ツールを使用し、特定の FP コントロールの状態を想定しているという前提で記述されています。これらのコントロールに期待どおりのコントロール状態を与え、実行がコントロールから戻ったときに Delphi コントロール状態に戻します。

于 2012-02-20T10:41:04.877 に答える