TWebBrowser と TEmbeddedWB を使用しているときに「ゼロによる浮動小数点除算」例外が時々発生するため、ゼロ除算例外 Set8087CW または SetMXCSR をマスクする必要があることを発見しました。
Q1:これを行うための最良のアプローチは何ですか:
- アプリケーションの起動の早い段階でそのような例外をマスクし、二度とそれらに触れないようにするには (アプリはマルチスレッドです)?
- イベントを使用
OnBeforeNavigate
してOnDocumentComplete
例外をマスク/マスク解除しますか? (ドキュメントが読み込まれた後に例外が発生する可能性はありますか?)
Q2: 「0 による除算」のみをマスクし、他には何もマスクしない最適な「コマンド」は何でしょうか? アプリケーションが 32 ビットの場合、64 ビットの例外もマスクする必要がありますか?
私が使用しているアプリケーションには、電子メールの内容を表示するためにいつでも利用できる TWebBrowser コントロールがあります。
また、誰かが明確にできる場合、これは Microsoft の TWebBrowser コントロールの特定のバグですか、それとも Delphi/C++ Builder と Microsoft ツールの単なる違いですか? ゼロ除算エラーが発生した場合、Visual C++ アプリケーション内で TWebBrowser をホストするとどうなりますか?例外には変換されませんが、その場合、Visual C++ は「ゼロ除算」例外をどのように処理しますか?
Microsoft がこれほど長い間この問題に気付かなかったのは奇妙なことです。また、Embarcardero もこれに気付かなかったのも奇妙です。浮動小数点例外をマスクすると、その特定の目的のために独自のプログラム例外も効果的にマスクされるためです。
アップデート
いくつかの検討後の私の最終的な解決策は次のとおりです。
SetExceptionMask(GetExceptionMask() << exZeroDivide);
GetExceptionMask()からのデフォルト状態は次を返します: TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision
. したがって、明らかに、一部の例外は既にマスクされています。これはexZeroDivide
、マスクされた例外に追加されるだけです。
その結果、すべてのゼロ除算は、例外ではなく浮動小数点の+INFになります。私はそれに耐えることができます-コードの製品バージョンでは、エラーを回避するためにマスクされ、デバッグバージョンでは、ゼロによる浮動小数点除算を検出するためにマスクが解除されます。