2011-01-13 11 views
9

Ho un programma di installazione, uno script NSIS compilato e prima controlla se un'altra versione della mia applicazione è in esecuzione sul sistema. Se esiste un'altra istanza, attiva prima la disinstallazione invisibile e procede quindi con l'installazione della nuova versione.Come eseguire un programma di disinstallazione NSIS da un altro programma di installazione NSIS e attendere che termini?

Uso ExecWait per attivare l'unistaller in modalità silenziosa ma il mio processo di installazione principale non attende e procede con il processo di installazione.

Come impongo all'installatore principale di attendere il completamento della disinstallazione invisibile all'utente?

risposta

11

C'è un programma di disinstallazione speciale parameter è necessario utilizzare (La ragione di questo è che normalmente il programma di disinstallazione deve essere in grado di cancellare se stesso)

ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR' 
+1

+1: Penso che questo non risponda alla domanda, funziona comunque per le piccole app. Quindi, +1 per soluzione alternativa :-). In realtà, ExecWait non attende ancora la fine del programma di disinstallazione, ma il programma di disinstallazione è ora eseguito silenziosamente (/ S) in background. Se il programma di disinstallazione richiede molto tempo, disinstallerebbe anche i dati attualmente installati. Pertanto, il disinstallazione e l'installazione funzionerebbero in parallelo. Quindi fai attenzione! –

+1

@Valentin: cosa ti fa pensare che ExecWait non aspetti? Attende WaitForSingleObject (hChildProcess, INFINITE); – Anders

+0

+1 Vedere [qui] (http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new) per come implementarlo su una funzione '. OnInit'. –

6

Non si tratta solo di "ExecWait". Si tratta anche di "_?", Un'istruzione di disinstallazione speciale. In realtà, durante la disinstallazione il uninstaller.exe viene copiato in una directory temporanea e quindi eseguito da lì.

Questo passaggio di copia e richiamo di un nuovo programma di disinstallazione dalla directory temp potrebbe essere rapido e la chiamata tornerà immediatamente senza attendere il completamento della disinstallazione.

Utilizzando "_?" istruzioni si dice a NSIS di eseguire il programma di disinstallazione dallo stesso posto e non dalla directory temporanea.

Utilizzando "ExecWait" oltre a "_?" dici a NSIS di attendere il completamento del processo di "disinstallazione" e poi di tornare. In questo modo ottieni ciò di cui hai bisogno.

fare riferimento a http://nsis.sourceforge.net/Docs/Chapter3.html#3.2.2 per ulteriori informazioni.

Problemi correlati