开发者

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

Edit:

The error was indeed in the handling; parseError also fails ans reveals the real error; see follow开发者_JAVA百科-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


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜