2012-07-31 15 views
15

Jak wykryć, czy użytkownik już zainstalował oprogramowanie, a jeśli tak, to w jaki sposób zaoferować możliwość usunięcia starej wersji?Jak wykryć starą instalację i usunąć ofertę?

Napisałem kilka linii, żeby to sprawdzić. Czy na razie jest to poprawne? Jeśli jest to poprawne, to w jaki sposób mogę pozwolić użytkownikowi wybrać, czy chce kontynuować instalację, czy odinstalować starą wersję?

#define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\setupname_is1" 

var 
    uninstallPath: string; 

function InitializeSetup: Boolean; 
begin 
    if (RegQueryStringValue(HKLM,'{#UNINSTKEY}','UninstallString',uninstallPath)) and 
    (uninstallPath <> '') and (fileexists(uninstallPath)) then 
    begin 
    Result := 
     (MsgBox(CustomMessage('NotVerifiedVersionFound'), mbConfirmation, 
       MB_YESNO or MB_DEFBUTTON2) = IDYES); 
    end; 
    { ... } 
end; 
+2

Zauważ, że nie ma żadnej potrzeby normalnie to zrobić z Inno Setup opartej. Wyjątki dotyczą aktualizacji z konfiguracji Inno. Kiedy używasz Inno, to w magiczny sposób radzi sobie z tym wszystkim. – Deanna

+1

możliwy duplikat [InnoSetup: Jak automatycznie odinstalować poprzednią zainstalowaną wersję?] (Http://stackoverflow.com/questions/2000296/innosetup-how-to-automatycznie-programuj-poprzednia-instalowana-wersja-) – Deanna

+0

@Deanna For my Klient jest prawdą, że to oprogramowanie zawsze będzie instalowane z konfiguracją inno. Ale Inno tak naprawdę "nie radzi sobie" z tym, prawda? Wszystko, co robi, to po prostu nadpisanie wszystkich starych plików. I mogę wygenerować Uninstaller. Ale chcę funkcji odinstaluj w mojej początkowej konfiguracji. – Exa

Odpowiedz

18

Można użyć roztworu Craig McQueena pierwotnie opublikowany tutaj: InnoSetup: How to automatically uninstall previous installed version?

function GetUninstallString: string; 
var 
    sUnInstPath: string; 
    sUnInstallString: String; 
begin 
    Result := ''; 
    sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1'); { Your App GUID/ID } 
    sUnInstallString := ''; 
    if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then 
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); 
    Result := sUnInstallString; 
end; 

function IsUpgrade: Boolean; 
begin 
    Result := (GetUninstallString() <> ''); 
end; 

function InitializeSetup: Boolean; 
var 
    V: Integer; 
    iResultCode: Integer; 
    sUnInstallString: string; 
begin 
    Result := True; { in case when no previous version is found } 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1', 'UninstallString') then { Your App GUID/ID } 
    begin 
    V := MsgBox(ExpandConstant('Hey! An old version of app was detected. Do you want to uninstall it?'), mbInformation, MB_YESNO); { Custom Message if App installed } 
    if V = IDYES then 
    begin 
     sUnInstallString := GetUninstallString(); 
     sUnInstallString := RemoveQuotes(sUnInstallString); 
     Exec(ExpandConstant(sUnInstallString), '', '', SW_SHOW, ewWaitUntilTerminated, iResultCode); 
     Result := True; { if you want to proceed after uninstall } 
     { Exit; //if you want to quit after uninstall } 
    end 
    else 
     Result := False; { when older version present and not uninstalled } 
    end; 
end; 
+0

Dzięki temu zadziałało! Myślę, że to pytanie wkrótce zostanie zamknięte jako duplikat. Nie widziałem drugiego pytania, które zostało już zadane w związku z tym problemem. – Exa

+0

jak używać/wywoływać tę funkcję? w której sekcji? innosetup newbie here – sam

+1

+1 Tylko kilka uwag. Kod nie będzie działał, jeśli aplikacja została zainstalowana przez użytkownika innego niż administrator (klucz rejestru ma wartość 'HKCU', a nie' HKLM'). Można również użyć zmiennej '{#SetupSetting (" AppId ")} lub preprocesora, aby uniknąć powtarzania' AppId' w ścieżce klucza rejestru. Zobacz moją odpowiedź na [Inno Setup: Jak zastąpić podczas instalacji, ale nie na zmianę?] (Http://stackoverflow.com/q/30566752/850848) na przykład. Lub [źródło tego kodu] (http://stackoverflow.com/a/2099805/850848), gdzie ten ostatni jest również objęty. –

Powiązane problemy