Проверка, запущено ли приложение в NSIS перед удалением - PullRequest
7 голосов
/ 02 апреля 2010

Я новичок в NSIS, и мне нужно знать, что в деинсталляторе, как я могу проверить, запущено ли приложение (которое находится в C ++) и закрыть его перед удалением.

Ответы [ 4 ]

8 голосов
/ 23 октября 2012

Вот немного более удобная версия для использования NSProcess , которая запрашивает приложение, а не закрывает его (ответ Оуэна)

${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}
7 голосов
/ 14 апреля 2010

Используйте плагин NsProcess. Загрузите его здесь -> NSProcess
Как это использовать? Так же просто, как:

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

где APP_EXE - имя вашего приложения ...

Загрузка также скажет вам, как его использовать ...:)

1 голос
/ 08 ноября 2017

Просто убедитесь, что первое, что делает установка или удаление, - это удаление всех файлов xyz.tmp в% TEMP (или любом другом каталоге для записи приложения) перед выполнением цикла for. Никаких плагинов не требуется.

!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
1 голос
/ 02 апреля 2010

В зависимости от приложения у вас есть несколько вариантов:

  • Если в вашем приложении есть окно с несколько уникальным именем класса, вы можете использовать FindWindow
  • Если ваше приложение создает именованный объект ядра (Mutex и т. Д.), Вы можете проверить его, вызвав правильный собственный win32 API с системным плагином
  • Используйте сторонний плагин, например FindProcDLL
...