3

私が作成したアプリケーションがあり、それは私のマシンにインストールされている外部アプリケーション (「ツール」と呼びましょう) のタスクに依存しているとします。私のプログラムでは、それを で呼び出しsystem( "tool myarguments" );、正常に動作します。

今、私は自分のアプリを配布したいと考えています。もちろん、エンドユーザーのマシンに「ツール」がインストールされていない可能性もあるので、アプリでこれをチェックして、ユーザーへのメッセージを出力したいと思います。だから私の質問は:

マシン上にアプリが存在するかどうかを確認するポータブルな方法はありますか? (名前が分かっていて、マシンのシェルからアクセスできると仮定します)。

追加情報: 最初のアイデアは、バイナリ ファイルの存在を確認することでしたが、次のようになりました。

  • これはプラットフォームに依存し、
  • インストール方法 (ソースからのビルド、パッケージからのインストールなど) によっては、ローカル パスからアクセスできますが、常に同じ場所にあるとは限りません。

この質問に対する私の最初の意見は「いいえ」ですが、誰かアイデアがあるのではないでしょうか?

参考:システム()

関連:stackoverflow.com/questions/7045879

4

2 に答える 2

2

Qt ツールキットを使用している場合は、QProcessが役立ちます。

編集: QProcess::error()の戻り値を探します: の場合はQProcess::FailedToStart、インストールされていないか、権限が不十分です。

于 2013-10-10T15:18:56.293 に答える
1

引数なしでツールを実行しても副作用がなく、終了コード 0 が返されることが予想される場合は、 を使用system("tool")してツールの存在を確認できます。

system次のように の戻り値を確認することで、コマンドが見つかったかどうかを確認できます。

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

すべてがうまくいき、コマンドの戻りステータスも 0 の場合、システムは 0 を返すことが期待されるという意味で移植性があります。

たとえば、Linux では、runningsystem("non_existing_command")は 0x7F00 を返します (によって返される値と同じタイプwait())。

Windows では、代わりに 1 を返します。

于 2013-10-10T15:38:13.940 に答える