Inno Setup non riesce a rimuovere i componenti durante la disinstallazione perché il mio programma è ancora in esecuzione e non è possibile eliminare l'eseguibile. Come faccio a controllarlo per vedere se è in esecuzione prima di consentire alla disinstallazione di procedere?La disinstallazione non riesce perché il programma è in esecuzione. Come posso fare in modo che Inno Setup controlli il processo in esecuzione prima di tentare la cancellazione?
risposta
controllare questi
Inno Setup: Detect instances running in any user session with AppMutex
Inno Setup: Is application running?
Inno Setup: Detect if an application is running
Ci sono diversi modi. Se il programma definisce utilizzare un mutex
[Setup]
AppMutex=MyMutexName
o per un mutex specificato nella sezione Code
function CheckForMutexes (Mutexes: String): Boolean;
Si potrebbe anche usare
function FindWindowByClassName (const ClassName: String): Longint;
per ottenere l'handle di finestra per nome della classe e mandalo messaggi
o scarica dal nome
function FindWindowByWindowName (const WindowName: String): Longint;
O si utilizza uno dei diversi file DLL per questo specifico caso d'uso
o farlo te stesso dopo aver letto
How To Terminate an Application "Cleanly" in Win32
How To Enumerate Applications Using Win32 APIs (questo link alla versione tedesca, come per qualche motivo non riesco a trovare la versione inglese di KB175030
o provare la versione tradotta di Google del KB175030-DE
Abbiamo utilizzato un metodo diverso da quello descritto sopra. Poiché si tratta di una disinstallazione, è possibile eliminare l'applicazione e annullarla. Il modo più semplice, quando la u non può usare AppMutex: (in relazione alla Really killing a process in Windows)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
speranza che qualcuno vi aiuterà questo. Ho cercato a lungo per questo.
Il 'taskkill' uccide più di un'istanza in esecuzione dello stesso processo? – TLama
Provato con notepad.exe e sta funzionando molto bene. Ucciderà l'applicazione senza feedback. – kdoteu
Grazie! Sì, uccide tutte le istanze a meno che non si esegua l'installazione con privilegi inferiori rispetto al processo elevato. [+ 1ed comunque :)] – TLama
Prova questa soluzione! Ho avuto problemi con altre soluzioni per chiudere l'app, ma Inno Setup pensava ancora che i file installati fossero bloccati.
Ricordate di definire le costanti:
#define MyAppName "AppName"
#define MyAppExeName "AppName.exe"
[Code]
function InitializeUninstall(): Boolean;
var ErrorCode: Integer;
begin
ShellExec('open','taskkill.exe','/f /im {#MyAppExeName}','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','tskill.exe',' {#MyAppName}','',SW_HIDE,ewNoWait,ErrorCode);
result := True;
end;
principali puntelli al original source of this solution.
Questo è ottimo, una cosa che ho cambiato è stata l'utilizzo di una procedura diversa invece di "function InitializeUninstall(): Boolean;" dovuto al fatto che questa funzione uccide l'app anche se l'utente annulla il processo di disinstallazione mentre "procedura InitializeUninstallProgressForm;" verrà eseguito solo se confermerà la disinstallazione. –
Utilizzare il AppMutex
directive per evitare che il programma di disinstallazione di procedere, quando un'applicazione è in esecuzione.
[Setup]
AppMutex=MyProgMutex
L'applicazione deve creare il mutex specificato dalla direttiva. Vedere la documentazione della direttiva AppMutex
collegata per gli esempi.
Se si desidera avere il programma di disinstallazione uccidere l'applicazione, quando si è ancora in esecuzione, utilizzare questo codice invece:
function InitializeUninstall(): Boolean;
var
ErrorCode: Integer;
begin
if CheckForMutexes('MyProgMutex') and
(MsgBox('Application is running, do you want to close it?',
mbConfirmation, MB_OKCANCEL) = IDOK) then
begin
Exec('taskkill.exe', '/f /im MyProg.exe', '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
end;
Result := True;
end;
Come con la direttiva AppMutex
sopra, l'applicazione deve creare il mutex specificato nella chiamata CheckForMutexes
.
Si noti che per l'installazione, non è necessario codificarlo. Il programma di installazione ha un gestore di riavvio integrato.
Vedere Kill process before (re)install using "taskkill /f /im" in Inno Setup.
- 1. Inno Setup Verifica del processo in esecuzione
- 2. Chiudere la versione di esecuzione del programma prima di installare l'aggiornamento (Inno Setup)
- 3. Come eseguire il programma prima che inizi la disinstallazione?
- 4. Come posso utilizzare GetVolumeInformation in Inno Setup?
- 5. Come rendere Visual Studio chiuso il processo in esecuzione prima di eseguire la compilazione?
- 6. Come posso verificare se un programma è in esecuzione per la prima volta?
- 7. Perché Microsoft.Office.Interop.Excel.Application.Quit() lascia in esecuzione il processo in background?
- 8. ProfileCommon - la trasmissione in fase di esecuzione non riesce
- 9. Perché la multiprocessing di Python è in esecuzione in sequenza?
- 10. In che modo Task Scheduler termina un processo in esecuzione?
- 11. scons - programma in esecuzione dopo la compilazione
- 12. Come verificare con inno-setup, se un processo è in esecuzione su Windows 2008 r2 a 64 bit?
- 13. Come posso montare un file in un contenitore, che non è disponibile prima della prima esecuzione?
- 14. Perché il mio metodo @BeforeClass non è in esecuzione?
- 15. Ottenere il processo in esecuzione dato l'handle di processo
- 16. Il garbage collector è in esecuzione in un processo separato?
- 17. Come eliminare la cartella durante il processo di disinstallazione?
- 18. Come posso ottenere la versione in esecuzione?
- 19. Il modo migliore per verificare se un'applicazione per iPhone è in esecuzione per la prima volta
- 20. Perché sto ricevendo un NPE che appare solo occasionalmente quando il programma è in esecuzione?
- 21. Linux - Trova se il processo è pronto o in esecuzione
- 22. Il processo del passeggero è già in esecuzione? ma la sua non
- 23. Come posso verificare un processo in esecuzione per sessione utente?
- 24. Processo in esecuzione in background dopo la chiusura del terminale
- 25. errore in esecuzione cpan la prima volta
- 26. Come Eclipse termina un programma in esecuzione?
- 27. Determinare se il programma è in esecuzione su Windows Server
- 28. La finestra di Tkinter dice (non risponde) ma il codice è in esecuzione
- 29. perché il gestore http non è in esecuzione
- 30. Perché php non è in esecuzione?
Risposta stupenda. Molto accurato; grazie! L'opzione mutex globale impiegò 5 minuti per farlo bene! Niente di meglio. – max
Hai una risposta per il file basato su rete che può essere aperto sulla memoria di un altro computer? – none
L'ultima versione inglese di KB 175030 che ho trovato sulla Wayback Machine è stata presa a febbraio 2007: http://web.archive.org/web/20070216103757/http://support.microsoft.com/kb/175030. –