2013-03-26 9 views
14

Sto tentando di configurare Inno Setup per il mio software (questo è un software C#). Ho intenzione di rilasciare molte versioni del mio software, vorrei cambiare l'interfaccia di installazione di inno setup se una versione precedente della mia applicazione è già installata sul computer. In questo caso, l'utente non dovrebbe essere in grado di modificare la directory di installazione.Creazione di un programma di installazione che eseguirà un aggiornamento se è già installata una versione precedente

ci sono quattro casi:

Primo caso: questa è la prima installazione del mio prodotto, Inno Setup procederà normalmente.

Secondo caso: il prodotto è già installato E l'installatore contiene una versione più recente. L'utente non può scegliere la cartella di destinazione. Può solo eseguire l'aggiornamento.

Terzo caso: se il programma di installazione contiene una versione precedente a quella installata, l'aggiornamento verrà disabilitato e verrà visualizzato un messaggio.

Quarto caso: la versione di installazione è la stessa della versione installata. L'utente può riparare la sua versione Actuel se necessario.

È possibile farlo con InnoSetup?

risposta

6

Inno Setup gestisce automaticamente i casi 1, 2 e 4 se lo AppID viene mantenuto uguale per la durata dell'applicazione.
È possibile anche nascondere le pagine della directory e di gruppo utilizzando i seguenti [Setup] direttive:

DisableDirPage=auto 
DisableGroupPage=auto 

Vai a questa ISXKB article per maggiori dettagli.

Per il caso 3, supponendo che i file siano stati eseguiti correttamente, Inno non eseguirà il downgrade di alcunché, ma in realtà non avviserà l'utente. Per fare ciò, è necessario aggiungere del codice per verificarlo, molto probabilmente nella funzione evento InitializeSetup().

+2

In realtà se si utilizza lo Script Wizard per creare lo script, il file di default per i file dell'applicazione è quello di aggiungere il flag 'ignoreversion', nel qual caso un downgrade eseguirà effettivamente il downgrade di tutti i file. Probabilmente è ancora una buona idea aggiungere un messaggio di avvertimento solo per confermare che l'utente ha davvero voluto farlo, ma altrimenti dovrebbe funzionare correttamente - assumendo che l'app stessa possa far fronte al declassamento (per esempio problemi di compatibilità dei dati). In caso contrario, è necessario aggiungere un errore anziché un avviso. – Miral

+1

@Miral Non l'avrei notato. Grazie per il testa a testa. – Deanna

+0

La logica di esempio per il controllo di 'InitializeSetup' sarebbe ottima ... Suppongo che ci siano già alcune definizioni inno per questo ... – Assimilater

8

Se si desidera avere un feedback per l'utente, è possibile provare qualcosa di simile. Prima di tutto, l'aggiornamento dovrebbe avere lo stesso nome AppId come app principale. Quindi è possibile impostare alcuni controlli, che visualizzeranno messaggi per informare l'utente sullo stato.

#define MyAppVersion "1.2.2.7570" 
#define MyAppName "MyApp Update" 

[Setup] 
AppId=MyApp 
AppName={#MyAppName} 
AppVersion={#MyAppVersion} 
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1,InstallLocation} 
DisableDirPage=True 

[CustomMessages] 
MyAppOld=The Setup detected application version 
MyAppRequired=The installation of {#MyAppName} requires MyApp to be installed.%nInstall MyApp before installing this update.%n%n 
MyAppTerminated=The setup of update will be terminated. 

[Code] 
var 
InstallLocation: String; 

function GetInstallString(): String; 
var 
InstPath: String; 
InstallString: String; 
begin 
InstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1'); 
InstallString := ''; 
if not RegQueryStringValue(HKLM, InstPath, 'InstallLocation', InstallString) then 
RegQueryStringValue(HKCU, InstPath, 'InstallLocation', InstallString); 
Result := InstallString; 
InstallLocation := InstallString; 
end; 

function InitializeSetup: Boolean; 
var 
V: Integer; 
sUnInstallString: String; 
Version: String; 
begin 
    if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'UninstallString') then begin 
     RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'DisplayVersion', Version); 
     if Version =< ExpandConstant('{#MyAppVersion}') then begin 
      Result := True; 
      GetInstallString(); 
     end 
     else begin 
MsgBox(ExpandConstant('{cm:MyAppOld}'+Version+'.'+#13#10#13#10+'{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
     Result := False; 
    end; 
end 
else begin 
    MsgBox(ExpandConstant('{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK); 
    Result := False; 
end; 
end; 
+0

1. Controlla se l'app è installata; 2. Verifica la versione dell'app; 3. Confrontare la versione dell'app con la versione di aggiornamento; 3a. se aggiornamento più recente quindi installare; 3b. se l'aggiornamento è precedente, non installare; 3c.se l'app non è presente, allora non installare – RobeN

+0

Inno memorizza automaticamente la directory di installazione, rendendo il codice 'DefaultDirName' ridondante. Inoltre, non si specifica un valore predefinito per la prima installazione. – Deanna

+0

Questo è solo il codice di aggiornamento, non l'app di base ... – RobeN

Problemi correlati