【问题标题】:Detecting an already running Java application from NSIS从 NSIS 检测已经运行的 Java 应用程序
【发布时间】:2011-12-08 13:44:32
【问题描述】:

是的,就是well documented如何获取你的应用程序的exe文件名,看看它是否正在运行。当所讨论的应用程序是 java 应用程序时,正在运行的 exe 将始终是 java.exe,因此此方法一无所获,因为当前可能正在运行任意数量的 java 应用程序,所有这些都是使用 java.exe 启动的。 每个传递的命令行参数都会有所不同,包括主类名。

我需要知道 java.exe 的命令行参数,这样我才能知道只有 java.exe MyProgram 会被终止。

我如何在 NSIS 中做到这一点?

【问题讨论】:

  • 很遗憾你没有选择JWS来启动应用程序。它内置了SingleInstanceService"SingleInstanceService确保只有一个版本的应用程序在任何给定时刻都显示在屏幕上。如果用户在某个实例已显示在屏幕上时打开程序,则会调用应用程序的通知方法,开发人员可以决定需要采取什么操作。"当然,JWS 也适用于有 JRE 的 MacOS 和 *nix 风格。
  • 我不能这样做,因为正在安装的应用程序很大,而且还包括一些要运行的 Windows 软件(生物识别硬件驱动程序)。

标签: java windows nsis


【解决方案1】:

我使用FindWindow 命令。这假定不同的 Java 应用程序具有不同的窗口标题。

编辑添加:虽然窗口类是必需参数,但空字符串(任何窗口类)是有效的窗口类参数。这是来自我的NSIS 安装程序之一的完整FindWindow 函数:

Function filzip_check
    filzip_check_start:
        ClearErrors
        FindWindow $5 "" "FilZip"
        StrCmp $5 "0" filzip_check_end +1
        MessageBox MB_OK "Please close any FilZip windows before continuing \
                the install"
        Goto filzip_check_start
    filzip_check_end:
FunctionEnd

【讨论】:

  • 我也查看了 FindWindow,但它要求将窗口类作为强制参数,并将窗口标题作为可选参数。我认为这是 Win32 级别的东西。我没有 Spy++ 或任何我可以下载的东西(例如 WinSpy++)可以告诉我我的 Java 应用程序的窗口类。有标准名称吗?
【解决方案2】:

jps -v 命令将为您提供正在运行的 Java 进程的命令行参数。

【讨论】:

  • 谢谢,这很有用,但在我的情况下,我不能假设有可用的 JDK 来运行它。我尝试安装的 Java 程序捆绑了它自己的 JRE。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多