2010-04-02 13 views

Respuesta

1

Dependiendo de la aplicación, que tienen un par de opciones:

  • Si la aplicación tiene una ventana con un nombre de clase algo único, se puede utilizar FindWindow
  • Si su aplicación crea un objeto de núcleo denominado (mutex etc) se puede comprobar mediante una llamada al API de Win32 nativa correcta con el sistema de plugins
  • uso de un tercero plug-in fiesta como FindProcDLL
+0

FindProcDLL no funcionará con la última versión de NSIS a partir de este comentario, 2.46, lanzado en 2009. – Rex

+3

Otra opción es la siguiente: 'ExecWait TaskKill/IM program_name/F' –

7

Use el plugin NsProcess. Descárguelo aquí ->NSProcess
¿Cómo usarlo? Tan simple como:

${nsProcess::KillProcess} "${APP_EXE}" $R4 

donde APP_EXE es el nombre de su aplicación ...

La descarga también le dirá cómo usarlo ... :)

7

Aquí es un poco más versión para el uso de NSProcess que solicita el cierre de la aplicación en lugar de que termina (respuesta de 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 mejor solución! – MiBol

0

Sólo asegúrese de que lo primero que instalar o UN-I nstall does es eliminar todos los archivos xyz.tmp en% TEMP (o cualquier otro directorio de escritura de la aplicación) antes de que se ejecute el ciclo siguiente. No se requieren complementos.

!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 
Cuestiones relacionadas