“对操作系统功能的调用失败”加载 Windows-1252 XML 文件时

发布于 2024-10-06 05:55:16 字数 1458 浏览 2 评论 0原文

编辑:

错误确实是在处理中; parseError 也失败并揭示了真正的错误;请参阅该错误的后续问题

老问题:

不知何故,有时下面的代码在使用 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 的环境中加载得非常好)。

——杰罗恩

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

熟人话多 2024-10-13 05:55:16

正如您在 SysUtils.pas 中看到的,该错误消息是在 GetLastError 返回零。 IXmlDomDocument.load 的文档没有建议您调用GetLastError来查找失败的原因。线程的最后一个错误值可能是默认的零值。

相反,检查文档对象的 parseError 值。它会给你一个 IXmlDomParseError 对象告诉您问题发生的地点和原因。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文