【问题标题】:detecting if program is installed on machine检测程序是否安装在机器上
【发布时间】:2013-10-10 15:14:59
【问题描述】:

假设我有一个我编写的应用程序,它依赖于安装在我的机器上的外部应用程序(我们称之为“工具”)上的某些任务。在我的程序中,我用 system( "tool myarguments" ); 调用它,工作正常。

现在,我想分发我的应用程序。当然,最终用户可能没有在他的机器上安装“工具”,所以我希望我的应用程序检查这一点,并为用户打印一条消息。所以我的问题是:

是否有一种可移植的方式来检查机器上是否存在应用程序?(假设我们知道它的名称并且可以通过机器的外壳访问它)。

附加信息:第一个想法是检查二进制文件是否存在,但是:

  • 这取决于平台,
  • 根据它的安装方式(从源代码构建、通过包安装...),它可能并不总是在同一个位置,尽管它可以通过本地路径访问。

我对这个问题的第一意见是“不”,但也许有人有想法?

参考:system()

相关:stackoverflow.com/questions/7045879

【问题讨论】:

  • 您是否可以以没有副作用的方式运行tool(除了打印版本或使用信息)并让它返回 0 退出代码?
  • @SirDarius 我不确定我是否理解您的评论。我想是的,我可以,但问题是如果它不存在会发生什么?
  • 啊。刚找到一个相关的问题(不过只针对Linux),之前没找到:stackoverflow.com/questions/7045879
  • 简单地说,system("tool")如果没有找到就会返回一个非零值。 (在 Windows 上测试:1,在 Linux 7F00 上)

标签: c++


【解决方案1】:

如果您使用 Qt 工具包,QProcess 可能会对您有所帮助。

编辑:查找QProcess::error()返回值:如果是QProcess::FailedToStart,要么没有安装,要么权限不足。

【讨论】:

  • 问题是,虽然这通常可以在 Linux 系统上运行(大多数可执行文件都在 PATH 中),但在 Windows 上通常情况并非如此,而且通常你必须寻找注册表来定位某些可执行文件的安装位置。
  • @MatteoItalia 我在发布后立即添加了解释,因为我意识到我的答案含糊不清。无论如何,这也是 system() 所做的,所以我认为这是 OP 要求的。
  • @MatteoItalia 好点,在 Windows 上这确实是一个皮塔饼
  • 对于 linux,which PROG 的返回值应该在没有实际启动的情况下做到这一点。
  • @kebs 我从来没有听说过没有which 的发行版。
【解决方案2】:

如果在没有参数的情况下运行该工具没有副作用,并且预计返回的退出代码为 0,您可以使用system("tool") 来检查工具是否存在。

您可以通过检查system的返回值来检查是否找到了该命令,如下所示:

int ret = system("tool");
if (ret != 0) {
    std::cout << "tool is not here, move along\n";
}

它是可移植的,如果一切顺利,系统期望返回0并且命令返回状态也是0。

例如,在 Linux 上,运行 system("non_existing_command") 返回 0x7F00(与 wait() 返回的值类型相同)。

在 Windows 上,它返回 1。

【讨论】:

  • 接受答案,尽管标准似乎不能保证这种行为(“实现定义的值”是常用术语)。无论如何,谢谢,它至少可以工作;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2016-03-19
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多