错误时加载有效的Windows 1252文件“系统错误:-2146697210”错误时加载有效的Wi

2019-05-12 11:18发布

不知何故,加载有效的Windows 1252 XML时有时下面的代码生成错误。

它使用MSXML6无法在Windows XP Professional x86的SP3。
它使用MSXML6成功的Windows 7旗舰版64位SP1。

注意:下面的代码是用Delphi编写的,但等效代码也无法在其他环境中。

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
    Parse(XmlDocument.parseError);
end;

在XMLDocument.load方法方法期间发生此错误:

reason: System error: -2146697210.
errorCode: -2146697210
url: C:\temp\1-Normal.xml

我修剪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负载在不使用MSXML6 .NET和其他环境完全没有问题,也可以在Windows 7旗舰版64位SP1罚款)。

--jeroen

Answer 1:

这种行为取决于哪个版本的MSXML6.DLL已安装。

要重现这更好的,我创建了另一个文件abnormal.xml ,除了normal.xml从问题。

文件转储abnormal.xml

000000: 3C 3F 78 6D 6C 20 76 65  72 73 69 6F 6E 3D 22 31 <?xml version="1
000010: 2E 30 22 20 73 74 61 6E  64 61 6C 6F 6E 65 3D 22 .0" standalone="
000020: 79 65 73 22 3F 3E 3C 52  4F 57 20 43 69 74 79 3D yes"?><ROW City=
000030: 22 E0 22 2F 3E 0D 0A                             "."/>..

文件abnormal.xml

<?xml version="1.0" standalone="yes"?><ROW City="à"/>

文件转储normal.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="."/>..

文件normal.xml

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

我期待的行为是:

  1. abnormal.xml失败,因为它没有指定编码,但包含了高位置1的字符
  2. normal.xml成功,因为它conains一个单字节编码支持高比特字符,因此具有高位的字符集被允许

这些是所观察到的场景:

MSXML6故障:

reason: System error: -2146697210.
errorCode: -2146697210
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Abnormal.xml

reason: System error: -2146697210.
errorCode: -2146697210
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Normal.xml

MSXML6成功:

reason: An invalid character was found in text content.

errorCode: -1072896760
url: file:///C:/My%20Dropbox/XMLEOSErrorTest/Abnormal.xml
srcText: <?xml version="1.0" standalone="yes"?><ROW City="
line: 1
linepos: 50
filepos: 49

这是概述什么版本的失败。
的DLL的括号中的名称是从他们的版本信息。

failure; XP Professional SP3:
msxml6.dll       version 6.20.1099.0  (MSXML 6.0 SP2)
msxml6r.dll      version 6.0.3883.0   (XML Resources)

success; Windows 7 Ultimate x64 SP1:
msxml6.dll       version 6.30.7600.16385  (MSXML 6.0 SP3)
msxml6r.dll      version 6.30.7600.16385
msxml6r.dll.mui  version 6.30.7600.16385

success; XP Professional SP3:
msxml6.dll       version 6.20.1103.0  (MSXML 6.0 SP3)
msxml6r.dll      version 6.0.3883.0   (XML Resources)

观察:

  • 自动Windows Update和Microsoft Update将不会更新MSXML6.DLL在Windows XP SP3的最新版本。
  • 有一个用于Windows XP没有MSXML6 SP3。
  • 最新版本实际上是在为6.20.2003.0 Windows XP SP2和情况可在http://support.microsoft.com/kb/973686 (它不会在Windows XP SP3安装)。
  • 可在以下适用于Windows XP SP3的版本6.20.1103.0的MSXML6.DLL http://support.microsoft.com/kb/973687 ( 直接下载XP SP3 )
  • 在微软的这个网站的信息非常少: http://www.google.com/search?q=msxml6+%226.20.1099.0%22+%226.20.1103.0%22+site:microsoft.com
  • 仅搜索6.20.1103.0没有透露更多: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=msxml6+%226.20.1103.0%22+site:microsoft.com
  • 这提供了最好的搜索结果: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=msxml6+%226.20.1103.0%22#sclient=psy&num=10&hl=en&q=msxml6+%226.20.1099.0%22 +%226.20.1103.0%22

所以:做MSXML6工作时,先放一个检查,你确实有你的目标Windows版本的最新MSXML6.DLL。

--jeroen



文章来源: Error when loading valid Windows-1252 document “System error: -2146697210”
标签: msxml msxml6