我们正在将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)确实支持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开始,此插件不再起作用...
NSIS : NsProcess UnExpected Output解决方法是删除Unicode=true
,但我不能这样做。
NSIS- FindProc always returns 1使用FindProcDLL
NSIS - check if process exists (nsProcess not working)错误是“找不到插件”,我们没有。
我确信,我们正在犯一些“愚蠢”的错误,因为我无法使自己相信我们是唯一有此要求的人。因此,欢迎上面未列出(或对上面的更正)的任何提示,建议和替代方案。
我们完全搞砸了任务列表调用。正如@Anders在评论中指出的那样:nsExec不支持管道,最重要的是,语法也被弄乱了。
上下文我们正在使用NSIS 3.05和Unicode true(这在以后很重要)。我们需要检查某个进程是否正在运行,我们将其称为“ processToFind.exe”。为了做到这一点,我们一直在...
官方示例对您有用吗?它可以在我的机器上运行。
我仍在使用ANSI,因为我正在使用其他一些没有Unicode变体的插件,因此nsProcess对我有用,我不确定如何回答您的主要问题。