Frage

In Delphi 2010 und Delphi 2007 verwende ich SET8087CW auf WebBrowserBeforenAvigate / WebBrowserDocumentComplete, um FPU -Fehler in ActiveX zu verhindern, um meine Anwendung zu verkrüppeln.

Aber irgendwie funktioniert dies nicht in Delphi XE2, zumindest im 64 -Bit -Modus.

Beim Klicken auf Links (beliebige) erhalte ich "Float Divide durch Null". (Das anfängliche Laden einer Website -Adresse oder eines Inhalts in TwebBrowser funktioniert einwandfrei.)

Der CallStack zeigt dies in System32 d3d10Warp.dll (möglicherweise von IE9 verwendet?) Als Reaktion auf TapPlication.ProcessMessage (und einige?

War es hilfreich?

Lösung

Sie müssen SSE -Ausnahmen auf 64 Bit maskieren, da 64 -Bit -Code normalerweise SSE zur Durchführung von schwimmenden Punktarithmetik verwendet.

Anruf SetMXCSR Um den Steuerungszustand der SSE -Einheit zu ändern. Persönlich würde ich weiterhin 8087 -Ausnahmen maskieren, da 64 -Bit -Code perfekt in Freiheit ist, die 8087 -Einheit zu verwenden, falls er dies wünscht. Der magische MXCSR -Wert, den Sie beim Aufrufen des Webbrowser -Codes verwenden möchten, ist $1F80. Dies ist der Standard -Windows -Wert für MXCSR.

Alternativ können Sie anrufen SetSSEExceptionMask und SetFPUExceptionMask Vorbeigehen exAllArithmeticExceptions Alle Ausnahmen maskieren. Diese Komfortmethoden würden Ihren Code lesbarer machen.

Wenn Sie zufrieden sind, dass Sie nur Ausnahmen auf 8087 unter x86 und sse unter x64 maskieren müssen, können Sie einfach anrufen SetExceptionMask. Dadurch wird der 8087 -Kontrollstatus unter x86 geändert und den SSE -Kontrollstatus unter X64 geändert.

Wenn ich mich zwischen der Festlegung des gesamten Kontrollzustands oder der Verwendung der Convenience -Methoden entscheiden müsste, um nur den Ausnahmemaskierteil des Staates zu ändern, würde ich den gesamten Kontrollzustand festlegen. Diese ActiveX -Steuerelemente werden unter der Annahme geschrieben, dass Sie MS -Tooling verwenden und einen bestimmten FP -Kontrollzustand erwarten. Ich würde diesen Steuerelementen den genauen Kontrollzustand geben, den sie erwarten, und dann zurück zum Delphi -Kontrollzustand zurückkehren, wenn die Ausführung aus den Steuerelementen zurückkehrt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top