【问题标题】:"A call to an OS function failed" when loading Windows-1252 XML file加载 Windows-1252 XML 文件时“调用 OS 函数失败”
【发布时间】:2010-12-02 21:30:38
【问题描述】:

编辑:

错误确实在处理中; parseError 也失败了,揭示了真正的错误;有关该错误,请参见 follow-up question

老问题:

不知何故,有时下面的代码在使用 Delphi XE 中的 msxml 单元加载 XML 时会产生异常。 它在使用 MSXML6 的 Windows XP Professional x86 SP3 和使用 MSXML6 的 Windows 7 Ultimate x64 SP1 上失败。

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 的环境中加载得非常好)。

--杰罗恩

【问题讨论】:

  • 错误是否真的发生 load 方法中,或者你引用的异常是否真的发生,因为you 调用了RaiseLastOSError ?我怀疑是后者。

标签: delphi delphi-xe msxml6 eoserror


【解决方案1】:

正如您在SysUtils.pas 中所见,该错误消息是GetLastError 返回零时给出的错误消息。 documentation for IXmlDomDocument.load 不建议您致电GetLastError 查找失败原因。您的线程的最后一个错误值可能是默认的零值。

相反,检查文档对象的 parseError 值。它会为您提供一个IXmlDomParseError 对象,告诉您问题发生的位置和原因。

【讨论】:

  • 哦,太棒了;我在没有注意到的情况下混淆了这两种错误范式。这不是一种奇怪的失明形式吗:-) 会跟进一个新问题和正确的错误(来自 parseError)。
猜你喜欢
  • 2019-12-12
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2013-10-10
  • 2016-07-13
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多