2010-12-02 5 views
1

Edit:«Вызов к функции ОС не удалось» при загрузке Windows-1252 файл XML

ошибка действительно была в обращении; parseError также не помогает ans показывает реальную ошибку; см. follow-up question за эту ошибку.

Старый вопрос:

Так или иначе, иногда ниже код генерирует исключение при загрузке XML с использованием блока MSXML в Delphi XE. Он не работает на Windows XP Professional x86 SP3 с использованием MSXML6 и Windows 7 Ultimate x64 SP1 с использованием 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; 

Эта ошибка возникает при методе XmlDocument.load:

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

Я обрезается в XML вниз к XML найден ниже.

Это шестнадцатеричный дамп файла 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="."/>.. 

Это XML:

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

Почему происходит ошибка?

(XML отлично загружается в .NET и других средах, не использующих MSXML6).

--jeroen

+1

Возникает ли ошибка во время * метода `load` или происходит ли какое-либо исключение, которое вы цитировали, потому что * вы * называете` RaiseLastOSError`? Я подозреваю последнего. – 2010-12-03 04:34:42

ответ

6

Как вы можете видеть в SysUtils.pas, что сообщение об ошибке тот, который дается, когда GetLastError возвращает ноль. documentation for IXmlDomDocument.load не советует вам позвонить GetLastError, чтобы узнать причину сбоя. Значение последней ошибки для вашего потока, вероятно, является нулевым значением по умолчанию.

Вместо этого проверьте значение parseError объекта документа. Он даст вам объект IXmlDomParseError, который сообщает вам, где и почему возникла проблема.

+0

О, блестящий; Я перепутал две парадигмы ошибок, даже не заметив. Разве это не странная форма слепоты :-) Будет следить за новым вопросом и правильной ошибкой (от parseError). – 2010-12-03 13:16:25