2013-10-10 30 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

相關問題