![]() |
MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
IDE: Delphi XE7
OS: Windows 7 Ultimate 64-bit Zum Extrahieren des reinen Textes aus einer HTML-Datei verwende ich MsHtml:
Delphi-Quellcode:
Das funktioniert wunderbar, solange es sich um eine 32-Bit-Anwendung handelt. Lasse ich das Projekt jedoch als 64-Bit-Anwendung in der IDE (Debug-Modus) ausführen, erscheint diese Fehlermeldung und das Programm beendet sich sofort, nachdem ich auf Fortsetzen gedrückt habe:
// ----- Extrahiert den Text der übergebenen HTML-Datei --------------------------------------------------------------------------
// ..... http://www.swissdelphicenter.ch/de/showcode.php?id=2352 Function GetHtmlBodyText(Const HtmlText : String) : String; Var IDoc : IHTMLDocument2; v : Variant; Begin Idoc := System.Win.ComObj.CreateComObject(Class_HTMLDOcument) as IHTMLDocument2; Try IDoc.designMode := 'on'; While IDoc.readyState <> 'complete' Do Application.ProcessMessages; v := VarArrayCreate([0, 0], VarVariant); v[0] := HtmlText; IDoc.Write(PSafeArray(System.TVarData(v).VArray)); IDoc.designMode := 'off'; While IDoc.readyState <> 'complete' Do Application.ProcessMessages; Result := IDoc.Body.InnerText; Finally IDoc := Nil; End; End; ... eine Exception der Klasse $C0000090 mit der Meldung 'c0000090 FLOAT_INVALID_OPERATION' aufgetreten. Ohne IDE gestartet beendet sich das Programm kommentarlos. Nun ist ja der Internet-Explorer in Win 7-64 eine 32-Bit-Anwendung, somit auch die DLL, auf die MsHtml zurückgreift. Okay, das hatten wir ja schon, daß man für das Einbinden einer DLL in eine 64-Bit-Anwendung eben auch die 64-Bit-DLL benötigt. Kein Problem, dachte ich mir, ![]() ![]() Ich starte mit Windows6.1-KB2729094-v2-x64.msu Ein Update ist für die Segoe UI-Symbol-Schriftart in Windows 7 und Windows Server 2008 R2 verfügbar. Dieses Update bietet Unterstützung für Emoji-Zeichen und einige Serversteuerelement-Glyphen, die in Windows 8 und Windows Server 2012 enthalten sind. Nach der Installation dieser Komponente müssen Sie den Computer neu starten. Daraufhin erhalte ich folgende Fehlermeldung: Eigenständiges Windows Update-Installationsprogramm Das Installationsprogramm hat einen Fehler festgestellt: 0x80070422 Der angegebene Dienst kann nicht gestartet werden. Er ist deaktiviert oder nicht mit aktivierten Geräten verbunden. Was ist das für ein Dienst? Der Windows-Installer-Service läuft (gestartet). Ich komme da erstmal nicht weiter ... Alternativen wären:
|
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Zitat:
MfG Dalai |
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
In welcher Programmzeile wird denn die Exception geworfen?
|
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Ist das nicht das "übliche" dass die Exception nicht in deinem Programm, sondern im IE Code kommt? Und zwar weil Delphi mit seinem Floating Point-Exception Masking sich nicht "standard-microsoftig" verhält?
Im Internet findet man auf den ersten Blick eine Menge zu TWebBrowser und Fließkomma-Exceptions, alle scheinen darauf hinauszulaufen, die FPU-Exceptions so zu drehen wie der IE-Code es auch erwartet: z.B. ![]() |
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Zitat:
Zwar konnte ich den IE-11-64 nun doch noch installieren (nach Aktivierung diverser Update-Services, die bei mir deaktiviert waren), doch tritt der Fehler weiterhin auf. Zitat:
Delphi-Quellcode:
Entweder beim Abfragen von
While IDoc.readyState <> 'complete' Do
Application.ProcessMessages; Result := IDoc.Body.InnerText;
Delphi-Quellcode:
oder beim Zuweisen von
IDoc.readyState
Delphi-Quellcode:
. Genauer läßt sich das nicht eingrenzen, da beim Durchsteppen mehrere Male ReadyState abgefragt wird und der Fehler manchmal beim dritten, manchmal erst beim zehnten Durchlauf auftritt. Ich bin mir nicht sicher, ob die Zuweisung von
IDoc.Body.InnerText
Delphi-Quellcode:
den Fehler auslöst oder die Abfrage von
IDoc.Body.InnerText
Delphi-Quellcode:
.
IDoc.readyState
Zitat:
![]()
Delphi-Quellcode:
Nach dem Neu-Erzeugen tritt der Fehler jedoch leider immer noch auf. Doch wir sind ja noch nicht am Ende der Fahnenstange, denn
...
VAR FormMain : TFormMain; Saved8087CW : Word; IMPLEMENTATION ... Procedure TFormMain.FormCreate(Sender: TObject); begin Saved8087CW := Default8087CW; {$IFDEF WIN64} Self.Caption := GLD.Programmtitel + '64-Bit-Version'; System.Set8087CW($133f); {$ELSE} Self.Caption := GLD.Programmtitel + '32-Bit-Version'; System.Set8087CW(Saved8087CW); {$ENDIF} ... Procedure TFormMain.FormDestroy(Sender: TObject); begin System.Set8087CW(Saved8087CW); end; ![]() Alternatively, you can call ![]() ![]() ![]() Allerdings muß ich gestehen, daß ich diese Alternative nicht wirklich verstehe. Wo und wie muß ich diese drei Methoden aufrufen? |
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Man braucht die Unit Math.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin SetExceptionMask(exAllArithmeticExceptions); ... end; |
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Laufen lassen und warten, wo der Debugger nach dem Knall hält, sagt dir nicht die Zeile?
Notlösung:
Delphi-Quellcode:
Und da wo er zuerst hällt, hat es zuvor geknallt.
try
while IDoc.readyState <> 'complete' Do try Application.ProcessMessages; except raise; // hier einen Haltepunkt end; except raise; // hier einen Haltepunkt end; try Result := IDoc.Body.InnerText; except raise; // hier einen Haltepunkt end; Vor dem Raise ein
Delphi-Quellcode:
geht im Win64 ja leider nicht mehr, um im Debugger einen Zwangsstopp zu veranlassen, falls es nicht von alleine anhält
asm INT 3 end;
Eventuell könnte man einen ![]() |
AW: MsHtml in 64-Bit-Anwendung erzeugt Float Invalid Operation
Zitat:
Das war der entscheidende Hinweis :!: (asexuell natürlich) Damit läuft es nun auch im 64-Bit-Mode :-D
Delphi-Quellcode:
Procedure TFormMain.FormCreate(Sender: TObject);
begin {$IFDEF WIN64} SetExceptionMask(exAllArithmeticExceptions); Self.Caption := GLD.Programmtitel + '64-Bit-Version'; {$ELSE} Self.Caption := GLD.Programmtitel + '32-Bit-Version'; {$ENDIF} ... Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz