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