NSIS nsProcess插件:总是返回“进程未运行”

问题描述 投票:0回答:2

上下文

我们正在将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支持(只需将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将始终返回603(“进程当前未在运行”。]]

是相同的,无论我们尝试查找32位还是64位进程。

这对于64位进程是期望的(它们不能从32位安装程序中找到,这对我们来说没关系)。

但是我do

希望它能找到32位进程。

已经探索过的替代方法:

浏览Check whether your application is running处的列表...

  • Processes插件:似乎已过时,仅找到源代码。

  • “ FindProcess.nsh”:命名冲突,没有用,也没有。相同的症状。

  • DDE服务器/ Win32同步/注册表:不可选项。

  • “ tasklist”命令:相同的症状。在cmd中执行时,它可以工作,但不能在安装程序中工作。nsExec::ExecToStack '"%SystemRoot%\System32\tasklist" /NH /FI "IMAGENAME eq ${processName}" | "%SystemRoot%\System32\find" /I "${processName}"'始终返回“错误”。 (*现在很清楚为什么,请参见下面的编辑)

  • “ FindProcDLL”插件:已跳过,因为

  • 从NSIS 2.46开始,此插件不再起作用...

    看似相关的Stackoverflow问题:


编辑

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

上下文我们正在使用NSIS 3.05和Unicode true(这在以后很重要)。我们需要检查某个进程是否正在运行,我们将其称为“ processToFind.exe”。为了做到这一点,我们一直在...

unicode nsis
2个回答
1
投票

官方示例对您有用吗?它可以在我的机器上运行。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.