2013-10-10 29 views
2

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

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

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

更多信息:第一个想法是检查二进制文件的存在,但:

  • 这是与平台相关的,
  • 取决于它如何被安装(建来源,通过软件包安装,...),它可能并不总是在同一个地方,尽管它可以通过本地路径访问。

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

参考:system()

相关:stackoverflow.com/questions/7045879

+0

是否有可能以无副作用的方式运行'tool'(除了打印版本或使用信息)并让它返回0退出代码? – SirDarius

+0

@SirDarius我不确定我是否理解你的评论。我认为是的,我可以,但问题是如果它不存在会发生什么? – kebs

+0

啊。刚刚发现一个相关的问题(但仅适用于Linux),没有找到它之前:http://stackoverflow.com/questions/7045879/ – kebs

回答

1

如果在没有参数的情况下运行该工具没有副作用,并且期望返回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。

+0

接受答案,虽然这种行为似乎没有被标准保证(“执行定义值”是通用术语)。无论如何,至少可以工作, - ;) – kebs

2

如果使用Qt工具包,QProcess可以帮助你。

编辑:并寻找QProcess::error()返回值:如果它是QProcess::FailedToStart,那么要么它没有安装,或者你没有足够的权限。

+0

问题是,虽然这通常适用于Linux系统(大多数可执行文件在'PATH'中),但在Windows上通常情况并非如此,并且通常您必须搜索注册表以找到可能安装某些可执行文件的位置。 –

+0

@MatteoItalia我发布后立即添加了一个解释,因为我意识到我的答案含糊不清。无论如何,这就是system()所做的,所以我认为这是OP所要求的。 – Polentino

+0

@MatteoItalia好点,在Windows上就是这样一个皮塔确实 – Polentino

相关问题