Sono nuovo in NSIS e ho bisogno di sapere che nel programma di disinstallazione, come posso verificare se l'applicazione (che è in C++) è in esecuzione e chiuderla prima di disinstallarla.Verificare se l'applicazione è in esecuzione in NSIS prima di disinstallare
risposta
A seconda dell'applicazione, si hanno un paio di scelte:
- Se l'applicazione ha una finestra con un nome di classe in qualche modo unico, è possibile utilizzare FindWindow
- Se l'applicazione crea un oggetto kernel di nome (Mutex ecc) è possibile verificare chiamando il corretto API Win32 nativa con il plugin di sistema
- Utilizzare un terzo plug-partito come FindProcDLL
Usa il plugin NsProcess. Scaricalo qui ->NSProcess
Come si usa? Per quanto semplice:
${nsProcess::KillProcess} "${APP_EXE}" $R4
dove APP_EXE è il nome della vostra applicazione ...
Il download vi dirà anche come usarlo ... :)
Qui è un po 'più versione amichevole per l'utilizzo di NSProcess che richiede l'applicazione di chiudere piuttosto che termina esso (risposta di Owen)
${nsProcess::FindProcess} "${APP_EXE}" $R0
${If} $R0 == 0
DetailPrint "${AppName} is running. Closing it down"
${nsProcess::CloseProcess} "${APP_EXE}" $R0
DetailPrint "Waiting for ${AppName} to close"
Sleep 2000
${Else}
DetailPrint "${APP_EXE} was not found to be running"
${EndIf}
${nsProcess::Unload}
La soluzione 'migliore! – MiBol
Basta fare in modo che la prima cosa che installano o non-i nstall fa è quello di eliminare tutti i file xyz.tmp in% TEMP (o qualsiasi altra directory scrivibile app) prima dell'esecuzione di loop in basso. Non sono richiesti plug-in.
!macro IsRunning
ExecWait "cmd /c for /f $\"tokens=1,2$\" %i in ('tasklist') do (if /i %i EQU xyz.exe fsutil file createnew $TEMP\xyz.tmp 0)"
IfFileExists $TEMP\xyz.tmp 0 notRunning
;we have atleast one main window active
MessageBox MB_OK|MB_ICONEXCLAMATION "XYZ is running. Please close all instances and retry." /SD IDOK
Abort
notRunning:
!macroEnd
FindProcDLL non funziona con l'ultima versione di NSIS come di questo commento, 2.46, rilasciato nel 2009. – Rex
Un'altra opzione è questo: ExecWait TaskKill/IM-programma/f' –