Проверка работы приложения в NSIS перед удалением

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


person Mahkameh    schedule 02.04.2010    source источник


Ответы (4)


Вот немного более удобная версия для использования 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}
person fiat    schedule 23.10.2012

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

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

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

Скачивание также расскажет, как им пользоваться ... :)

person Owen    schedule 14.04.2010
comment
что значит $R4? - person mrid; 10.08.2020

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

  • Если в вашем приложении есть окно с несколько уникальным именем класса, вы можете использовать FindWindow
  • Если ваше приложение создает именованный объект ядра (Mutex и т. Д.), Вы можете проверить его, вызвав правильный собственный Win32 API с системным плагином.
  • Используйте сторонний плагин, например FindProcDLL.
person Anders    schedule 02.04.2010
comment
FindProcDLL не будет работать с последней версией NSIS, указанной в этом комментарии, 2.46, выпущенной в 2009 году. - person Rex; 12.12.2011
comment
Другой вариант: ExecWait TaskKill /IM program_name /F - person juergen d; 23.03.2012
comment
+1 для FindWindow, так как он легкий (без плагинов и прямых системных вызовов ) и работает как раз для простых случаев. - person ojdo; 16.09.2019

Просто убедитесь, что первое, что нужно сделать при установке или удалении, - это удалить все файлы 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
person n-mam    schedule 08.11.2017