Я новичок в NSIS, и мне нужно знать, что в программе удаления я могу проверить, работает ли приложение (которое находится на C ++), и закрыть его перед удалением.
Проверка работы приложения в NSIS перед удалением
Ответы (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
что значит
$R4
?
- person mrid; 10.08.2020
В зависимости от приложения у вас есть несколько вариантов:
- Если в вашем приложении есть окно с несколько уникальным именем класса, вы можете использовать FindWindow
- Если ваше приложение создает именованный объект ядра (Mutex и т. Д.), Вы можете проверить его, вызвав правильный собственный Win32 API с системным плагином.
- Используйте сторонний плагин, например FindProcDLL.
person
Anders
schedule
02.04.2010
FindProcDLL не будет работать с последней версией NSIS, указанной в этом комментарии, 2.46, выпущенной в 2009 году.
- person Rex; 12.12.2011
Другой вариант:
ExecWait TaskKill /IM program_name /F
- person juergen d; 23.03.2012
+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