2010-04-02 3 views

risposta

1

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
+0

FindProcDLL non funziona con l'ultima versione di NSIS come di questo commento, 2.46, rilasciato nel 2009. – Rex

+3

Un'altra opzione è questo: ExecWait TaskKill/IM-programma/f' –

7

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 ... :)

7

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} 
+0

La soluzione 'migliore! – MiBol

0

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