【问题标题】:NSIS Detect running background processNSIS 检测正在运行的后台进程
【发布时间】:2017-05-08 19:24:00
【问题描述】:

当我的 NSIS 安装程序正在执行时,我需要能够在后台查找另一个正在运行的进程。在完成新的安装程序之前,必须终止并卸载此其他进程。

我尝试使用 FindProc 插件来查找进程,并尝试使用 KillProc 插件来终止进程。这些插件中的每一个都不会返回任何结果。

FindProcDLL::FindProc "MyApplication.exe"

KillProcDLL::KillProc "MyApplication.exe"

我也试过nsProcess插件,还是不行。

nsProcess::_KillProcess "MyApplication.exe" $R0

似乎人们在使用这些插件方面取得了成功,但我不知道为什么它在我的场景中不起作用,除非它与后台进程有关。

任何帮助将不胜感激。

【问题讨论】:

  • 这个应用程序有什么特别之处吗? 64位?以其他用户身份运行?服务?
  • 这是一个 32 位应用程序。它以试图删除它的同一用户身份运行。它是在系统托盘中运行的 WPF 应用程序,因此可能不存在物理窗口。
  • 如果它有一个托盘图标,它必须有一个窗口,但它应该与插件无关。它是否适用于 Notepad.exe 等其他应用程序?
  • 使用 nsProcess::_KillProcess "Notepad.exe" $R0 不起作用。我还在 MessageBox 中输出 $R0 的值,而 $R0 的值是空的,因为没有任何值。
  • 当一个插件作为这样的参数提供时,它不能写入寄存器。

标签: process nsis


【解决方案1】:

我试过的 NSIS 插件都没有工作。它们都不会返回任何结果(甚至不返回 0 或负数)。我最终只使用了以下命令,并且没有问题。它会短暂弹出一个命令窗口,但在我的场景中我可以接受:

ExecWait "TaskKill /IM MyApplication.exe /F"

希望这对其他人有所帮助。

【讨论】:

    【解决方案2】:

    如果不知道您使用的是哪个 NSIS 版本,也不知道您是否正在编译 Unicode 或 ANSI 安装程序,那么很难准确地说出发生了什么。

    原版from the wiki只支持32位进程,hnedka版本应该也支持64位进程。

    如果您使用的是 hnedka 版本和 NSIS v2.x,则需要将插件从 ANSI 文件夹解压缩到 \NSIS\Plugins。如果您使用的是 NSIS v3,则需要从 ANSI 文件夹中提取到 \NSIS\Plugins\x86-ansi 并从 Unicode 文件夹中提取到 \NSIS\Plugins\x86-unicode。

    我可以确认 hnedka 版本在 NSIS v3 中有效。如果 $R0 为空,则可能是您将错误的插件 .dll 提取到了错误的文件夹中。

    【讨论】:

      【解决方案3】:

      显然您正在尝试查找并终止一个不受支持的 x64 进程。你应该检查这个链接 http://nsis.sourceforge.net/Processes_plug-in

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-21
        • 2016-06-19
        • 1970-01-01
        • 2012-01-22
        • 2023-03-10
        • 2021-04-06
        • 2013-09-13
        相关资源
        最近更新 更多