2010-12-02 15 views
1

Edit:"Ein Aufruf zu einer OS-Funktion ist fehlgeschlagen", wenn Windows-1252-XML-Datei geladen

Der Fehler war in der Tat in der Handhabung; parseError schlägt auch fehl und zeigt den wirklichen Fehler; Für diesen Fehler siehe follow-up question.

Alte Frage:

Irgendwie manchmal unterhalb der Code erzeugt eine Ausnahme, wenn XML Laden der msxml Einheit in Delphi XE verwenden. Es schlägt unter Windows XP Professional x86 SP3 mit MSXML6 und Windows 7 Ultimate x64 SP1 mit MSXML6 fehl.

procedure TXMLEOSErrorTestCase.Test; 
var 
    XmlDocument: IXMLDOMDocument3; 
    XmlFileName: string; 
begin 
    XmlDocument := CoFreeThreadedDOMDocument60.Create(); 
    XmlFileName := TPath.Combine(TPath.GetDirectoryName(ParamStr(0)), '1-Normal.xml'); 
    if not XmlDocument.load(XmlFileName) then 
    RaiseLastOSError(); 
end; 

Dieser Fehler tritt bei der XmlDocument.Load Methode:

EOSError at $00423B2D 
A call to an OS function failed 

ich die XML in die XML wie folgt zu finden abgespeckte.

Dies ist der Hex-Dump der XML-Datei:

000000: 3C 3F 78 6D 6C 20 76 65 72 73 69 6F 6E 20 3D 20 <?xml version = 
000010: 22 31 2E 30 22 20 65 6E 63 6F 64 69 6E 67 3D 22 "1.0" encoding=" 
000020: 57 69 6E 64 6F 77 73 2D 31 32 35 32 22 3F 3E 3C Windows-1252"?>< 
000030: 52 4F 57 20 43 69 74 79 3D 22 E0 22 2F 3E 0D 0A ROW City="."/>.. 

Dies ist der XML:

<?xml version = "1.0" encoding="Windows-1252"?><ROW City="à"/> 

Warum tritt der Fehler auf?

(Die XML-Dateien werden in .NET und anderen Umgebungen, in denen MSXML6 nicht verwendet wird, problemlos geladen.)

--jeroen

+1

Tritt der Fehler wirklich * während * der 'load' Methode auf, oder tritt die von Ihnen angegebene Ausnahme tatsächlich auf, weil * Sie *' RaiseLastOSError' genannt haben? Ich vermute Letzteres. –

Antwort

6

Wie Sie in SysUtils.pas sehen können, dass Fehlermeldung ist derjenige, der gegeben ist, wenn GetLastError Null zurückgibt. Die documentation for IXmlDomDocument.load rät Ihnen nicht, GetLastError aufzurufen, um den Grund für den Fehler zu ermitteln. Der letzte Fehlerwert für Ihren Thread ist wahrscheinlich der Standard-Nullwert.

Überprüfen Sie stattdessen den Wert parseError des Dokumentobjekts. Es gibt Ihnen ein IXmlDomParseError Objekt, das Ihnen sagt, wo und warum das Problem aufgetreten ist.

+0

Oh brilliant; Ich habe die beiden Fehlerparadigmen verwechselt, ohne es zu bemerken. Ist das nicht eine seltsame Form der Blindheit :-) Wird mit einer neuen Frage und dem richtigen Fehler (von parseError) nachgehen. –