NSIS nsProcess 插件:总是 returns "process not running"

NSIS nsProcess Plugin: Always returns "process not running"

上下文

我们正在使用 NSIS 3.05Unicode 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) 确实支持 unicode。这就是我们选择使用它的原因。

NSIS UNICODE support (just rename nsProcessW.dll into 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 将 always return 603 ("Process was not currently running").

无论我们尝试查找 32 位还是 64 位进程,都是一样的。

这对于 64 位进程来说是正常的(它们不能从 32 位安装程序中找到,这对我们来说没问题)。

但我希望它能找到 32 位进程。

已探索的备选方案:

正在查看在 Check whether your application is running 找到的列表 ...

探索的看似相关的 Whosebug 问题:


我敢肯定,我们犯了一些 "stupid" 错误,因为我无法让自己相信我们是唯一有此要求的人。因此,欢迎任何未在上面列出的提示、建议和替代方案(或对上述内容的更正)。


编辑

我们完全搞砸了任务列表调用。正如@Anders 在评论中指出的那样:nsExec 不支持管道 最重要的是,语法也搞砸了。

我仍在使用 ANSI,因为我使用的是其他一些没有 Unicode 变体的插件,因此 nsProcess 适合我,但我不确定如何回答您的主要问题。

但是,关于您列出的替代任务列表命令,语法不太正确。在 find.exe.

的管道中,您缺少 "IMAGENAME eq ${processName}["] 之后的结束引号和 ["]${processName}" 之前的开始引号

另外请注意,如果您使用 %SystemRoot%\System32\,32 位进程将被重定向到 C:\Windows\SysWOW64\,并且某些程序没有 32 位等效项(例如,pnputil ).在这种情况下,这并不重要,但无论如何要解决这个问题,您应该改用 $WINDIR\SysNative 。您也可以使用 x64.nsh 中的 ${DisableX64FSRedirection},但显然存在一些潜在的陷阱。

编辑:是的,Anders 在对原始问题的评论中提到了管道和 ExecToStack 的问题,要求调用以 cmd.exe /C

为前缀

官方例子适合你吗?它适用于我的机器。

试试这个:

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 插件结构,请参阅 .