2018年01月25日

コマンドプロンプトからGUIのプログラムを実行し待機したいときに

昨日ちょこっとだけ書いた、ステータスバー監視のプログラムを書こうと思ったら、監視しようとしていたのはステータスバーではなくで独自描画されたグラフィック領域で残念…の話の続き。

結局、監視するのではなく、そのソフトは処理終了後にプロセスを自動終了させるオプションを持っているので、プロセスの動作状態を監視しておけば良い、ということになりました。

つまり、子プロセスとしてそのソフトを起動(CreateProcess)し、WaitForSingleObject() API等で待機すれば良いということですね。

さて、ソフトの位置やオプションは引数で与えるとして、どうやってCreateProcess() に渡そうか。
コマンドプロンプトのプログラムなので、引数はarvc/argv で受け取ることになります。
これをCreateProcess() APIに渡すための引数にするのは、ちょっと面倒。
小間切れに分かれた文字列(argv[])を1つの文字列に再構成し、さらに、スペースが含まれる場合はダブルコーテーションで囲まなければなりません。メッチャ面倒。

GetCommandLine() APIを使おうかとも思いましたが、これは自身のプログラムファイル名も含んでしまうので、除去が面倒。

となると、C言語らしく、_spawnvp()関数に_P_WAIT付けて実行してしまえばよいんじゃないかと。

waitfor_program.png

すると、どうやらうまくいきました!

waitfor_program2.png

試しに、引数にNotepad.exeを与えてみると、メモ帳が起動し、親プログラムは待機。メモ帳を終了させると、親プログラムは終了。WaitForSingleObject() APIも書かずに、上手くいきました! やってみるもんだな。

…と、これをTwitter上で書いたところ、「start /wait」コマンドを使えば良いのではないかとツッコミが…!

し、知らなかった…。
そんな便利なオプションがstartコマンドに存在していたとは…。

無知は罪ですね。

posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング