"A call to an OS function failed" when loading Windows-1252 XML file

Jeroen Wiert Pluimers picture Jeroen Wiert Pluimers · Dec 2, 2010 · Viewed 6.9k times · Source

Edit:

The error was indeed in the handling; parseError also fails ans reveals the real error; see follow-up question for that error.

Old question:

Somehow, sometimes the code below generates an exception when loading XML using the msxml unit in Delphi XE. It fails on Windows XP Professional x86 SP3 using MSXML6 and Windows 7 Ultimate x64 SP1 using 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;

This error occurs during the XmlDocument.load method:

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

I trimmed the XML down to the XML found below.

This is the hex dump of the XML file:

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

This is the XML:

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

Why does the error occur?

(The XML loads perfectly fine in .NET and other environments not using MSXML6).

--jeroen

Answer

Rob Kennedy picture Rob Kennedy · Dec 3, 2010

As you can see in SysUtils.pas, that error message is the one that's given when GetLastError returns zero. The documentation for IXmlDomDocument.load does not advise you to call GetLastError to discover the reason for the failure. The last-error value for your thread is probably the default zero value.

Instead, inspect the document object's parseError value. It will give you an IXmlDomParseError object that tells you where and why the problem occurred.