【问题标题】:Inno Setup crashes in appendChild msxmlInno Setup 在 appendChild msxml 中崩溃
【发布时间】:2013-07-29 12:53:21
【问题描述】:

我想在 Inno Setup 中修改 xml 文件 - 但安装程序崩溃。我尝试了不同的方法,结果得到了有问题的示例代码

procedure testXml();
var
  xmlDocLocal, nodeLocal: Variant;
begin
try
   xmlDocLocal := CreateOleObject('MSXML2.DOMDocument');
   xmlDocLocal.async := False;
   xmlDocLocal.resolveExternals := False;
   xmlDocLocal.loadXML('<root></root>');
   nodeLocal := xmlDocLocal.CreateElement('element1');
   xmlDocLocal.documentElement.appendChild(nodeLocal);
except
end;

end;

在第二次调用期间,安装程序在 appendChild 方法上崩溃。我做错了什么?

【问题讨论】:

  • 你做对了!这很奇怪,真的,真的很奇怪,而且非常严重......您的代码应该可以正常工作。甚至微软在 MSDN 上也展示了一个类似的例子。我无法追踪出了什么问题,也无法在 Delphi 中重现它,因此它可能与 Pascal 脚本本身有关,但很难说。但是,作为一种解决方法,您可以使用createNode 方法this way。这对我来说很好,但我只能说这些。
  • 关于 MSXML 崩溃的一些注释,可能是相关的。 stackoverflow.com/a/42869405/572002

标签: inno-setup


【解决方案1】:

三个想法:首先,我们使用 InnoSetup,但对我们而言,需要使用另一个以特定版本 6.0 结尾的字符串来创建 OleObject:

try
    XMLDoc := CreateOleObject('MSXML2.DOMDocument.6.0');
except
    RaiseException('Please install MSXML first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
end;

第二个想法:尝试将 xml 标头添加到代码中的 XML 字符串。像这样:

xmlDocLocal.loadXML('<?xml version="1.0" encoding="UTF-8" ?><root></root>');

第三个想法:尝试检查错误(正如我在第一个 sn-p 中所展示的那样)。这可能会让你很好地了解出了什么问题。这就是我们的做法(并且有效):

XMLDoc.load(XMLFileName);
if XMLDoc.parseError.errorCode <> 0 then
  XMLDoc.load(XMLFileName2);
if XMLDoc.parseError.errorCode <> 0 then
  RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);

希望这对您有所帮助。难以解决未知问题;-)

【讨论】:

  • 1) 我试过了。同样的问题仍然存在。 2)这是有价值的一点!没试过…… 2)我试过没有解析错误;此外,documentElementnodeLocal 变量不是NULL。而且,最奇怪的是,它发生在第二次通话中。我还尝试通过将变量设置为Unassigned 来显式释放接口引用,但它也没有帮助... [+1 为好点,无论如何!]
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 2012-11-16
相关资源
最近更新 更多