2010-12-02 63 views
1

Edit:« Un appel à une fonction du système d'exploitation a échoué » lors du chargement de fichier XML Windows 1252

L'erreur était en effet dans le traitement; parseError échoue également et révèle la véritable erreur; Voir follow-up question pour cette erreur.

vieille question:

D'une certaine façon, parfois le code ci-dessous génère une exception lors du chargement XML en utilisant l'unité de Delphi XE MSXML dans. Il échoue sur Windows XP Professionnel x86 SP3 en utilisant MSXML6 et Windows 7 Édition Intégrale x64 SP1 en utilisant MSXML6.

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; 

Cette erreur se produit au cours de la méthode XmlDocument.Load:

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

Je rognée XML vers le XML trouve ci-dessous.

Ceci est le vidage hexadécimal du fichier XML:

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="."/>.. 

C'est le XML:

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

Pourquoi se produit l'erreur?

(Le XML se charge parfaitement dans .NET et d'autres environnements n'utilisant pas MSXML6).

--jeroen

+1

L'erreur se produit-elle vraiment * pendant la méthode 'load', ou est-ce que l'exception que vous avez citée se produit réellement parce que * vous * appelez 'RaiseLastOSError'? Je soupçonne ce dernier. –

Répondre

6

Comme vous pouvez le voir dans SysUtils.pas, ce message d'erreur est celle qui est donnée lorsque GetLastError renvoie zéro. Le documentation for IXmlDomDocument.load ne vous conseille pas d'appeler GetLastError pour découvrir la raison de l'échec. La dernière valeur d'erreur pour votre thread est probablement la valeur zéro par défaut.

À la place, inspectez la valeur parseError de l'objet de document. Il vous donnera un objet IXmlDomParseError qui vous indique où et pourquoi le problème est survenu.

+0

Oh brillant; J'ai mélangé les deux paradigmes d'erreur sans même m'en apercevoir. N'est-ce pas une forme étrange de cécité :-) Suivra avec une nouvelle question et la bonne erreur (de parseError). –