2012-07-31 12 views
15

¿Cómo puedo detectar si el usuario ya instaló el software y, de ser así, cómo ofrecer la posibilidad de eliminar la versión anterior?¿Cómo detectar la instalación anterior y la eliminación de la oferta?

He escrito algunas líneas para verificarlo. ¿Es correcto por ahora? Si esto es correcto, ¿cómo puedo dejar que el usuario elija si desea continuar la instalación o desinstalar la versión anterior?

#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

Tenga en cuenta que normalmente no hay ninguna necesidad de hacer esto con una configuración basada Inno. Las excepciones son cuando se actualiza desde una configuración que no es Inno. Una vez que estás usando Inno, mágicamente maneja todo esto para ti. – Deanna

+1

posible duplicado de [InnoSetup: cómo desinstalar automáticamente la versión instalada anterior?] (Http://stackoverflow.com/questions/2000296/innosetup-how-to-automatically-uninstall-previous-installed-version) – Deanna

+0

@Deanna Para mi cliente, es cierto que este software siempre se instalará con una configuración inno. Pero Inno en realidad no lo "maneja", ¿verdad? Todo lo que hace, es simplemente sobrescribir todos los archivos antiguos. Y puedo generar un desinstalador. Pero quiero la funcionalidad Desinstalar dentro de mi configuración inicial. – Exa

Respuesta

18

Se puede utilizar la solución de Craig McQueen originalmente publicado aquí: 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

¡Gracias, funcionó! Sin embargo, creo que esta pregunta pronto se cerrará como un duplicado. No vi la otra pregunta que ya se ha hecho sobre este tema. – Exa

+0

cómo usar/llamar a esta función? en que sección? innosetup newbie aquí – sam

+1

+1 Solo unas pocas notas. El código no funcionará si la aplicación fue instalada por un no administrador (por lo que la clave de registro está en 'HKCU' y no' HKLM'). También se puede usar la variable '{#SetupSetting (" AppId ")}' o preprocesador para evitar repetir el 'AppId' en la ruta de la clave de registro. Ver mi respuesta a [Inno Setup: ¿Cómo sobrescribir en la instalación pero no en el cambio?] (Http://stackoverflow.com/q/30566752/850848) para ver un ejemplo. O el [origen de este código] (http://stackoverflow.com/a/2099805/850848), donde este último también está cubierto. –

Cuestiones relacionadas