4

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;

2 回目の呼び出し中に、appendChild メソッドでインストーラーがクラッシュします。私は何を間違っていますか?

4

1 に答える 1

2

3 つのアイデア: まず、InnoSetup を使用していますが、特定のバージョン 6.0 で終わる別の文字列で OleObject を作成する必要があります。

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

2 番目のアイデア: コード内の XML 文字列に xml ヘッダーを追加してみてください。このような:

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

3 番目のアイデア: エラーをチェックしてみてください (最初のスニペットで既に示したように)。これにより、何がうまくいかないかについてかなり良いアイデアが得られるかもしれません。これが私たちのやり方です(そしてそれは機能します):

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);

これがお役に立てば幸いです。未知の問題を解決するのは難しい;-)

于 2013-08-01T08:45:27.857 に答える