使用 MSXML2.DOMDocument 创建 XML 文件的安装完成后 Windows 事件日志中出现错误

Error in Windows Event Log after finishing installation that creates XML file using MSXML2.DOMDocument

我在 Inno Setup 中制作了安装程序。它工作得很好。但是每次它完成安装我的应用程序时,我都会在事件日志中看到下一个条目:

Faulting application name: installer.tmp, version: 51.1052.0.0, time stamp: 0x4d81e0ff
Faulting module name: msxml3.dll, version: 8.110.9600.18046, time stamp: 0x55e72d43
Exception code: 0xc0000005
Fault offset: 0x00099ba1
Faulting process id: 0x4020
Faulting application start time: 0x01d151dd82e2baf9
Faulting application path: C:\Users\VALENT~1\AppData\Local\Temp\is-NDCPA.tmp\installer.tmp
Faulting module path: C:\Windows\System32\msxml3.dll
Report Id: d80ffece-bdd0-11e5-82a0-bc5ff4d35ede
Faulting package full name: 
Faulting package-relative application ID: 

在 google 中探索这个问题只会让我发现人们在使用不同应用程序(主要是 Internet Explorer)时遇到的问题。

任何人至少可以指出我正确的方向,这样我就可以消除日志中的这个错误吗?

更新 经过几天的调查(完整的脚本相当大),我得出结论,该异常是由下一个代码引起的

XMLDoc := CreateOleObject('MSXML2.DOMDocument');

RootNode := XMLDoc.createElement('SQLServerSettings');
RootNode := XMLDoc.appendChild(RootNode);

Node := XMLDoc.createElement('SQLServerLocation');
Node.text := SQLServerLocation;
RootNode.appendChild(Node);

如果调用最后一个 appendChild 方法,则会抛出异常。现在至少它是有道理的(因为 msxml3.dll 抛出了异常)。 它不依赖于元素名称或其内容。如果我将其重构为

Node := RootNode.appendChild(XMLDoc.createElement('SQLServerInstanceName'));

它仍然会在日志中抛出异常。

任何想法,可能是什么原因造成的?或者我可以尝试在 Inno Setup 脚本中创建 XML 文件的任何其他方式?

我可以重现你的问题。

不过,如果我明确要求 MSXML2.DOMDocument:

的 6.0 版,我不会收到错误消息
XMLDoc := CreateOleObject('MSXML2.DOMDocument.6.0');

当您使用 version-independent ProgID (MSXML2.DOMDocument) 时,version 3.0 is allegedly used。 3.0 版本似乎遇到了你面临的问题,它可能在 6.0 中修复了。

如果您需要支持 Windows XP,您可以回退到 3.0:

try
  XMLDoc := CreateOleObject('MSXML2.DOMDocument.6.0');
except
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
end;

如果这没有帮助,作为一个糟糕的解决方法,您可以将 XML 文件写成一个字符串。如果您正在创建一个新的 XML 文件(与编辑现有的 XML 文件相反),这很容易。

XML :=
  '<SQLServerSettings><SQLServerLocation>' +
    SQLServerLocation +
  '</SQLServerLocation></SQLServerSettings>';
SaveStringToFile(FileName, XML, False);

请注意 SaveStringToFile 不支持 Unicode 字符串。