Inno Setup аварийно завершает работу в appendChild msxml

Я хочу изменить XML-файл в Inno Setup, но программа установки дает сбой. Я пробовал разные вещи, и в результате получил пример кода с проблемой

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. Что я делаю неправильно ?


person user474554    schedule 29.07.2013    source источник
comment
Ты делаешь это правильно! Это странно, очень, очень странно и довольно серьезная проблема... Ваш код должен работать правильно. Даже Microsoft показывает аналогичный пример на MSDN. Я не могу отследить, что не так, и я не смог воспроизвести это в Delphi, так что это может быть как-то связано с самим Pascal Script, но трудно сказать. Однако в качестве обходного пути вы можете использовать createNode метод this way. Это сработало хорошо для меня, но это все, что я могу сказать об этом.   -  person TLama    schedule 29.07.2013
comment
Некоторые примечания о сбоях MSXML, которые могут быть уместны. stackoverflow.com/a/42869405/572002   -  person Nicholi    schedule 18.03.2017


Ответы (1)


Три идеи: во-первых, мы используем InnoSetup, но для нас необходимо создать OleObject с другой строкой, оканчивающейся на конкретную версию 6.0:

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

Идея третья: попробуйте проверить на ошибки (как я уже показывал в первом фрагменте). Это может дать вам довольно хорошее представление о том, что идет не так. Вот как мы это делаем (и это работает):

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

Надеюсь, это поможет вам. Трудно решить неизвестную проблему ;-)

person Akku    schedule 01.08.2013
comment
1) Я пробовал. Та же проблема остается. 2) Это ценный момент! Не пробовал... 2) Когда я пытался, не было ошибки синтаксического анализа; кроме того, переменные documentElement и nodeLocal не являются NULL. И, что самое странное, это происходит на втором звонке. Я также пытался явно освободить ссылки на интерфейсы, установив переменные в Unassigned, но это также не помогло... [+1 за хорошие очки, в любом случае!] - person TLama; 01.08.2013