Контекст
Мы используем NSIS 3.05 с Unicode true
(это важно позже).
Нам нужно проверить, является ли определенный процесс запустив , назовем его «processToFind.exe».
Для этого мы использовали nsProcess
Плагин, который настроен правильно, найден и отлично интегрирован.
Мы включаем плагины из нашего git репозитория, например:
!addincludedir "C:\pathToRepo\NSIS\Include"
!addplugindir "C:\pathToRepo\NSIS\Plugins"
, где pathToRepo
, конечно, является допустимым путем. Мы также попытались использовать каталоги плагинов по умолчанию (NSIS-Dir\Plugins\x86-unicode
), но безрезультатно (см. Ниже).
Документация гласит: nsProcess (v 1.6) поддерживает юникод. Вот почему мы решили его использовать.
Поддержка NSIS UNICODE (просто переименуйте nsProcessW.dll в nsProcess.dll)
При установке Unicode false
или выходе из настройки (по умолчанию это ansi), тоже работает нормально. (= запущенные процессы не найдены, не запущенные процессы не найдены)
Установщик 32-разрядный, мы работаем на 64-разрядных Windows 10 машинах.
Код
${nsProcess::FindProcess} "procexp.exe" $R0
MessageBox MB_OK "procexp: [$R0]"
, который определен в nsProcess.nsh
(предоставляется плагином, а не собственным кодом)
!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`
!macro nsProcess::FindProcess _FILE _ERR
nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
Pop ${_ERR}
!macroend
Проблема
При установке Unicode true
nsProcess будет всегда return 603 («Процесс еще не запущен»).
Это то же самое, независимо от того, пытаемся ли мы найти 32-битные или 64-битные процессы.
Этого можно было бы ожидать для 64- битовые процессы (их нельзя найти в 32-битных установщиках, что нам подходит).
Но я делаю ожидаю, что он найдет 32-битные процессы.
Альтернативы уже изучены:
Просматривая список, найденный на Проверьте, работает ли ваше приложение ...
Плагин процессов: Кажется устаревшим, только найден исходный код.
"FindProcess.n sh": конфликт имен, не сработал, ни. Симптомы те же.
Сервер DDE / Win32 Syn c / Registry: не вариант.
Команда "tasklist": те же симптомы. При выполнении в cmd работает, но не из установщика. nsExec::ExecToStack '"%SystemRoot%\System32\tasklist" /NH /FI "IMAGENAME eq ${processName}" | "%SystemRoot%\System32\find" /I "${processName}"'
всегда возвращает «ошибку». (* теперь понятно почему, см. правку ниже)
Плагин "FindProcDLL": пропущен, потому что
Начиная с NSIS 2.46, этот плагин больше не работает .. .
Казалось бы, связанные вопросы Stackoverflow исследованы вопросы:
Я уверен, что мы совершаем какую-то «глупую» ошибку, поскольку я не могу заставить себя поверить, что мы единственные, кто имеет такое требование. Таким образом, приветствуются любые подсказки, предложения и альтернативы, которые не перечислены выше (или исправления к вышеупомянутому).
Редактировать
Мы полностью испортили вызов списка задач. Как отметил @Anders в комментарии: nsExe c не поддерживает каналы , и, кроме того, синтаксис также был испорчен.