Плагин NSIS nsProcess: всегда возвращает «процесс не запущен» - PullRequest
1 голос
/ 14 января 2020

Контекст

Мы используем 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 не поддерживает каналы , и, кроме того, синтаксис также был испорчен.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Официальный пример работает на вас? Это работает на моей машине.

Попробуйте:

0) Удалите все файлы nsProcess.dll (в NSIS, в ваших папках включения везде)

1) Удалить строку !addplugindir "C:\pathToRepo\NSIS\Plugins" из вашего скрипта для использования плагинов в каталогах NSIS

2) Скопируйте файл nsProcessW.dll в **c: \ Program Files (x86) \ NSIS \ Plugins \ x86 -unicode **

3) Переименовать файл c: \ Program Files (x86) \ NSIS \ Plugins \ x86-unicode \ nsProcessW.dll -> nsProcess.dll

4) Скомпилируйте ваш скрипт с Unicode true

Я полагаю, что существует некоторое несоответствие файлов. Чтобы понять структуру плагинов NSIS, смотрите NSIS - проверьте, существует ли процесс (nsProcess не работает) .

1 голос
/ 14 января 2020

Я все еще использую ANSI, потому что я использую некоторые другие плагины, у которых нет варианта Unicode, поэтому nsProcess работает для меня, и я не уверен, как ответить на ваш главный вопрос.

Тем не менее, re: альтернативный вариант команды tasklist, который вы перечислили, синтаксис не совсем правильный. Вам не хватает закрывающей кавычки после "IMAGENAME eq $ {processName} ["] и вводной кавычки перед ["] $ {processName}" в канале для find.exe.

Также обратите внимание, что если вы используете% SystemRoot% \ System32 \, 32-разрядный процесс будет перенаправлен на C: \ Windows \ SysWOW64 \, а некоторые программы не имеют 32-разрядного эквивалента (например, pnputil). В этом случае это не имеет большого значения, но в любом случае, чтобы обойти это, вы должны использовать вместо этого $ WINDIR \ SysNative. Вы также можете использовать $ {DisableX64FSRedirection} из x64.n sh, но там, по-видимому, есть некоторые потенциальные подводные камни.

РЕДАКТИРОВАТЬ: Ах да, и есть проблема с pipe и ExecToStack, упомянутые Андерсом в комментариях на оригинальный вопрос, требующий префикса вызова с cmd.exe / C

...