首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSIS nsProcess插件:总是返回“进程不运行”

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

Stack Overflow用户
提问于 2020-01-14 12:59:53
回答 2查看 2K关注 0票数 1

上下文

我们使用NSIS 3.05Unicode true (这在以后很重要)。

我们需要检查某个进程是否正在运行,让我们称之为"processToFind.exe“。

为了做到这一点,我们一直在使用nsProcess插件,它的设置是正确的,找到并集成得很好。

我们包括git存储库中的插件,如下所示:

代码语言:javascript
运行
复制
!addincludedir "C:\pathToRepo\NSIS\Include"
!addplugindir "C:\pathToRepo\NSIS\Plugins"

当然,pathToRepo是一个有效的路径。我们还尝试使用默认插件目录(NSIS-Dir\Plugins\x86-unicode),但没有效果(见下文)。

文档显示,nsProcess (v1.6)支持unicode。这就是为什么我们选择使用它。

NSIS支持(只需将nsProcessW.dll重命名为nsProcess.dll)

在设置Unicode false或退出设置(因此默认为ansi)时,它也运行良好。(=找到正在运行的进程,而不是未找到正在运行的进程)

安装程序是32位,我们运行在64位Windows 10机器上。

代码

代码语言:javascript
运行
复制
${nsProcess::FindProcess} "procexp.exe" $R0
MessageBox MB_OK "procexp: [$R0]"

它是在nsProcess.nsh中定义的(由插件而不是自己的代码提供)

代码语言:javascript
运行
复制
!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位安装程序中找到,这对我们来说是正常的)。

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

已探讨的替代办法:

查一下在检查应用程序是否正在运行。找到的名单..。

  • 进程插件:似乎过时了,只有源代码找到。
  • "FindProcess.nsh“:命名冲突,也不起作用。同样的症状。
  • DDE / Win32同步/注册表:不是一个选项。
  • “任务列表”命令:相同的症状。在cmd中执行时,它可以工作,但不能从安装程序执行。nsExec::ExecToStack '"%SystemRoot%\System32\tasklist" /NH /FI "IMAGENAME eq ${processName}" | "%SystemRoot%\System32\find" /I "${processName}"'总是返回“错误”。(*现在很清楚为什么,请参阅下面的编辑)
  • "FindProcDLL“插件:跳过是因为 从NSIS 2.46这个插件不再工作..。

似乎相关的堆栈溢出问题探讨了:

我相信,我们正在犯一些“愚蠢”的错误,因为我无法相信只有我们有这种要求。因此,欢迎没有列出的任何提示、建议和替代方案(或对上述内容的更正)。

编辑

我们完全搞砸了任务清单上的电话。正如@Anders在评论中指出的: nsExec不支持管道,而且最重要的是语法也搞砸了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-15 05:47:01

官方的例子对你有用吗?它在我的机器上工作。

试试这个:

0)删除所有nsProcess.dll文件(在NSIS中,在包含文件夹中,在任何地方)

1)从脚本中删除行!addplugindir "C:\pathToRepo\NSIS\Plugins",以便在NSIS目录中使用插件

2)将文件nsProcessW.dll复制到**c:\Program (x86)\NSIS\Plugins\x86-unicode**

3)重命名文件c:\Program (x86)\NSIS\Plugins\x86-unicode\nsProcessW.dll -> nsProcess.dll

4)用Unicode真编译脚本

我相信有一些文件不匹配。要了解NSIS插件结构,请参阅NSIS -检查是否存在进程(nsProcess不工作)

票数 2
EN

Stack Overflow用户

发布于 2020-01-14 20:19:44

我仍然在使用ANSI,因为我使用的是其他没有Unicode变体的插件,所以nsProcess适合我,我不知道如何回答您的主要问题。

但是,re: tasklist命令,您列出的选项,语法不太正确。在到processName的管道中,您在"IMAGENAME eq ${processName}“之后缺少一个结束引号,而在"${processName}”之前缺少一个开头引号。

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

编辑:啊,是的,Anders在对原始问题的评论中提到了pipe和ExecToStack的问题,要求调用以cmd.exe /C作为前缀

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59734294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档