• ベストアンサー

Cで、呼び元のDOSバッチを終了させたい

DOSのバッチからexeを呼んで、そのexe内で呼び元であるバッチファイルの呼んだ行以降に行かないようにしたいのですが出来るでしょうか? バッチでerrorlevel拾って判断して終わらせる(EXIT? )のではなく、EXE内でDOS窓を閉じたいのです。 C++で書いてます。 どなたかわかる方知恵をお願いいたします。 出来ないというのでもかまいませんが・・

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

WINDOWS APIを使って可能だと思います。 結構面倒くさいので、サンプルプログラムは書きませんけど、手順としては、(他にも方法はあるかもしれませんが) GetDesktopWindow を使って、大元ウインドウハンドルを得る GetWindow(Wnd, GW_CHILD) GetWindow(Child, GW_HWNDNEXT) を使って子ウインドウのハンドルを得る GetWindowText(Wnd, Title, sizeOf(Title)) を使ってウインドウのタイトルを得る。 そのタイトルがバッチで起動されるタイトルと同じ(か含まれる)だったら PostMessage(hd,WM_CLOSE,0,0) で終了させる。 自分自身を終了させる。

kan520
質問者

補足

早速回答ありがとうございます 教えていただいたやり方だと、タイトルで判断するので、同じタイトルを持つウインドウは全て対象となってしまいます。 「コマンド プロンプト」というヤツです 自分のウインドウという判断はつかないのでしょうか?

その他の回答 (4)

  • keikan
  • ベストアンサー率42% (75/176)
回答No.5

コマンドプロセス(DOS)でバッチファイルを実行 ↓ BATファイル中のEXEを起動 ↓ EXE終了 ↓ BATファイルの次の行の実行 ↓ BAT終了 ↓ コマンドプロンプト終了 ということかな^^ ここで、EXE終了後にBATの次の行を実行させたくないということかな。 BATファイル行単位で読み込まれて実行されてたと思うので EXEファイル中でBATファイルをすり替えればいけたと思う。EXEが実行されるまで同じように作ったBATファイルを用意してもとBATファイルと名前を入れ替えればEXE終了後そのまま終わるのでは?^^ でも、終わらせるだけならBAT中のIF文でEXEの戻り値で終了ラベルまでとばした方が簡単かな^^;; でも純粋なDOSだと子プロセスになるから子プロセスから親プロセスはきれないけどWINならいいのかな^^;; ・・・・・ちょっととんちんかんだったかな バッチファイルのプロパティーで終了後ウインドウを閉じる設定にするのはだめですか?^^

kan520
質問者

お礼

流れは仰る通りですが、すり替えでは上手くいきませんでした。 簡単な終了ラベル飛ばしの方向で行きます。 ていうか今まで通りですが・・・ ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

バッチファイルへのショートカットを作って任意の名前を付ければ、ウインドウタイトルは、ショートカット名になるようです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

どういう風に使われるのかわからないので、とりあえず、DOS窓が1つという仮定の下に#1を書きました。 複数起動している、と言うことであれば、 今、起動しているものがアクティブ(フォアグラウンド)になっていると期待して良いのなら(バッチを起動したんだから多分フォアグラウンドになっている) GetForegroundWindow で、フォアグラウンドになっているウィンドウのハンドルを捕まえられます。 いずれにしても、危険なことは間違いないです。 errorlevelとGOTOでやるのが無難だと思いますが。

kan520
質問者

お礼

DOS窓は1つではなく複数です。 その上で、バッチ処理されている流れの中の途中で、バッチのそれ以降に行かせないように、自分のDOS窓だけを閉じたかったのですが、どうにも自分のレベルでは今は無理そうなので、おっしゃる通り無難の方向に行こうと思います。

  • qKAZp
  • ベストアンサー率47% (71/148)
回答No.2

検証してないので、はずしてたらすみません。 DOSプロンプトから直接目的のEXEを呼び出さずに、 目的のEXEを起動オプションから受け取って 内部で実行させる、ランチャーをかましてやれば 良さそうに思います。 DOSプロンプトはランチャーが終了した時点で閉じると思いますが。 詳しいコマンドを覚えてないんで(今手元に環境が無いんで)漠然とした答えになってしまいましたが、 shell系のコマンドで、処理終了待ちするのと、 呼び出しっぱなしで次の処理に移っていくのと 2種類あったと思います。 ちょっと調べてみてください。