"Ошибка вызова функции ОС" при загрузке XML-файла Windows-1252

Редактировать:

Ошибка действительно была в обработке; 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).

--jeroen

1 ответ

Решение

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

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

Другие вопросы по тегам