“对操作系统功能的调用失败”加载 Windows-1252 XML 文件时
编辑:
错误确实是在处理中; 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
正如您在 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 forIXmlDomDocument.load
does not advise you to callGetLastError
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 anIXmlDomParseError
object that tells you where and why the problem occurred.