Толик Панков
hex_laden
............ .................. ................
October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

NSIS: поиск и завершение (kill) внешнего процесса.

Делается с помощью плагина nsProcess.

Установка плагина


1. Качаем архив
2. Распаковываем содержимое архива по соответствующим каталогам NSIS

NsProcess.zip\Example --> C:\Program Files (x86)\NSIS\Examples\nsProcess
NsProcess.zip\Include --> C:\Program Files (x86)\NSIS\Include\
NsProcess.zip\Plugin\nsProcess.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-ansi\nsProcess.dll
NsProcess.zip\Plugin\nsProcessW.dll --> C:\Program Files (x86)\NSIS\Plugins\x86-unicode\nsProcess.dll


Пример


Начало:

Unicode true
!include LogicLib.nsh

Name "KillProcessExample"
OutFile "KillProcessExample.exe"
ShowInstDetails show
RequestExecutionLevel User


Немного дополнил пример из официального мануала, вставив макрос для расширенного вывода сообщений об ошибках:

!macro PrintProcError ErrCode

Код разлапистый, потому на PasteBin: !macro PrintProcError ErrCode

Код внутри секции:

1. Запускаем тестовую программу (calc.exe, которая обычно есть в любой винде и лежит она обычно в $SYSDIR, т.е. в C:\Windows\System32\) и ждем 500 миллисекунд:

DetailPrint "Start calc.exe..."
Exec "$SYSDIR\calc.exe"
Sleep 500


2. Спрашиваем у пользователя, будем ли убивать процесс. Если нет - идем на завершение:

MessageBox MB_YESNO|MB_ICONQUESTION "Kill process calc.exe?" IDYES 0 IDNO "EndProg"

3. Ищем процесс(ы) по имени экзешника:

DetailPrint "Find process calc.exe..."
nsProcess::_FindProcess "calc.exe"


Да, можно хоть 10 калькуляторов назапускать.

4. Вытаскиваем из стека результат функции _FindProcess:

Pop $R0

5. Выводим на псевдоконсоль расшифровку кодов возврата:

!insertmacro PrintProcError $R0

6. Если код возврата = 0, значит, процесс найден, пытаемся его убить, выводим расшифровку кодов возврата, и опять подождем 500 миллисекунд:

${If} $R0 = 0
	DetailPrint "Process calc.exe found. Kill it..."
	nsProcess::_KillProcess "calc.exe"
	!insertmacro PrintProcError $R0
	Sleep 500
${EndIf}


Вывод на экран




Исходник примера


На GitHub

Источники


- Официальная справка плагина (на буржуйском)
- Перевод от Leha Silent (копия)

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/04/02/nsis-poisk-i-zavershenie-kill-vneshnego-protsessa/

From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.