2017-02-14 3 views
1

Meine Anforderung ist, vor der Installation von SQL-nativen Client 11 zu überprüfen, und die vorherige Version zu deinstallieren. Ich konnte die vorherige Installation problemlos überprüfen, kann sie jedoch nicht deinstallieren.UninstallString in Inno-Setup ausführen

ich die Lösung in den How to detect old installation and offer removal? erwähnt verwendet

Während der Laufzeit, erhalte ich die folgenden Fehler

Exception: Internal error: Unknown constant "A22EED3F-6DB6-4987-8023-6C6B7030E554".

(wobei die Konstante die GUID des nativen Client ist) während der Ausführung der

Linie
Exec(ExpandConstant(sUnInstallString), '', '', SW_SHOW, ewWaitUntilTerminated, iResultCode); 

Die sUnInstallString ist

MsiExec.exe /I{A22EED3F-6DB6-4987-8023-6C6B7030E554} 

Vielen Dank im Voraus.

Antwort

2

Das ist keine Konstante (Inno Setup). Das ist eine GUID. Entfernen Sie den Anruf ExpandConstant.

Und Sie müssen die Deinstallationszeichenfolge auf einen Programmpfad und seine Parameter aufteilen.

var 
    P: Integer; 
    UninstallPath: string; 
    UninstallParams: string; 
begin 
    { ... } 

    { In case the program path is quoted, because it contains spaces. } 
    { (it's not in your case, but it can be, in general) } 
    if Copy(sUnInstallString, 1, 1) = '"' then 
    begin 
    Delete(sUnInstallString, 1, 1); 
    P := Pos('"', sUnInstallString); 
    end 
    else P := 0; 

    if P = 0 then 
    begin 
    P := Pos(' ', sUnInstallString); 
    end; 
    UninstallPath := Copy(sUnInstallString, 1, P - 1); 
    UninstallParams := TrimLeft(Copy(sUnInstallString, P + 1, Length(sUnInstallString) - P)); 

    Exec(UninstallPath, UninstallParams, '', SW_SHOW, wWaitUntilTerminated, iResultCode); 
    { ... } 
end; 
+0

danke eine Tonne für diese Lösung, funktioniert gut. – DeeJay007

+0

Im Deinstallationsassistenten erhalte ich drei Optionen _Modify_, _Repair _, _ Remove_. Sind irgendwelche Parameter verfügbar, um _Remove_ auszuwählen und mit der Deinstallation in der 'Exec'-Funktion fortzufahren. Ich habe '/ SILENT' versucht, aber es scheint nicht zu funktionieren. – DeeJay007

+0

Das ist eine versteckte Funktion auf dem 'MsiExec'. Ich konnte nie herausfinden, wie es funktioniert. Versuchen Sie eine neue Frage zu stellen. Jemand wird es sicher wissen. –

Verwandte Themen