«Ошибка вызова функции ОС» при загрузке XML-файла Windows-1252 - PullRequest
1 голос
/ 03 декабря 2010

Изменить:

Ошибка действительно была в обработке; parseError также дает сбой и выявляет реальную ошибку; см. следующий вопрос об этой ошибке.

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

Почему-то иногда код ниже генерирует исключение при загрузке 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).

- Йерун

1 Ответ

6 голосов
/ 03 декабря 2010

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

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

...