• ベストアンサー

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種類あったと思います。 ちょっと調べてみてください。

関連するQ&A

  • バッチファイルのDOS窓について

    こんにちは Windows7Ulti32ビットを使用しています セキュリティホール云々とはいわれていますが、やはりガジェットは使い心地がよく 継続して使用したいと思っています ただ、数回に1回しかガジェットの表示がされず、他の時にはガジェットが表示されません。 sidebar.exeをkillして、再度sidebar.exeを起動すると復活するのですが、毎回やるのは 面倒なのでバッチでkillして再起動しようと思いました ところがそのバッチのdos窓が閉じずに、、今度はそちらで悩んでいます 以下に記載するバッチファイルを実行後、DOS窓を閉じるには どのようにバッチファイルを作成すればいいのでしょうか? SideBarCtrl.bat @echo off taskkill /im sidebar.exe /f > nul start "" timeout 2 > nul start /min cmd /c,"C:\Windows\winsxs\x86_microsoft-windows-sidebar_31bf3856ad364e35_6.1.7601.17514_none_d0e415a884ea33e1\sidebar.exe" exit

  • DOSの終了

    教えてください。 DOSでバッチを作成したのですが、 終了のコマンドって「exit」ですよね。 それを入力したのですが、終了してくれません。。。 なぜでしょうか??? えっと、実際に入力したコマンドは 「start winpopup.exe(エンター) exit」です。 ちゃんとwinpopupは起動するのですが、DOS画面が終了しません。 どなたか教えてください。

  • C#でのプログラム方法

    C#(コンソールでの実行ファイル)でのバッチファイル実行方法に悩んでいます。 実行イメージとして **************************************** 1. C#(A.exe)をダブルクリックで起動する 2. C#プログラム[A]はバッチファイルを起動する 3. C#(B.exe)をダブルクリックで起動する 4. C#プログラム[B]は2で起動したバッチファイルを終了させる(=DOS窓をCloseさせる?) **************************************** を考えています。 1~2の処理はなんとなくわかったのですが 4にてバッチファイルが起動しているDOS窓をどうCloseさせたらいいのかわかりません。 助けてください。

  • DOS終了コードの確認

    有識者の方、バッチファイルの終了コードの確認方法について、ご教授願います。当方、終了コード判定のBAT作成は初めてです。 質問: TXT(a.txt)ファイル、文字列検索を行った結果、該当の文字列が見つかった場合、終了コードを"0"では無く、"1"でバッチファイルを終了する場合(EXITコマンド終了コード1)、バッチファイルの終了コード"1"が正しく出されているのか確認の仕方を教えてください。 よろしくお願い致します。 +++temp.bat+++++ Find C:\temp\a.txt "aaa" →%ERRORLEBEL%の結果 0 IF NOT ERRORLEVEL 1 (exit /B 1)

  • 終了コード errorlevel の考え方について

    こんばんは。 OSはWindowsXP Proを使っています。 テキストファイルに書いてある値を 終了コードにするバッチファイルを作成しました。 以下の2ファイルを同じディレクトリに保存します。 test.txt ┌--------┐   1 └--------┘ test.bat ┌---------------------------------------┐   @echo off   find "0" test.txt   if not errorlevel 1 exit /b 0   find "1" test.txt   if not errorlevel 1 exit /b 1   echo テキストは0~1の値ではありません。   exit /b 2 └---------------------------------------┘ この状態で次のように実行します (1) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT 1 (2) C:\>echo %errorlevel% 1 (3) C:\>set errorlevel=0 (4) C:\>echo %errorlevel% 0 ※ここでtest.txtの中の数字を2にします。 (5) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT テキストは0~1の値ではありません。 (6) C:\>echo %errorlevel% 0 (7) C:\>set errorlevel= (8) C:\>echo %errorlevel% 2 となります。 (2)の結果から、(1)で実行した「exit /b 1」でerrorlevelに1が格納されることが判ります。 しかし、(6)の結果から、(3)で実行した「set errorlevel=0」が (5)で実行した「exit /b 2」より優先されていることが判ります。 しかし(7)でerrorlevelの値を消去したように思われますが、 (8)の結果から、(3)のセットを消去しつつ(5)で実行した「exit /b 2」を記憶しているように見えます。 この挙動について、どのように理解すれば良いのでしょうか。 また「exit /b ○」と「set errorlevel=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • バッチ実行後DOS窓を閉じるには

    Windows Me 上での操作なんですが、バッチファイルをダブルクリックで実行後、自動的にDOS窓を閉じるようにしたいです。なおバッチファイルのプロパティに「終了時にウィンドウを閉じる」という設定があるのは知っているんですが、バッチファイル実行時に自動生成されるショートカットを消す為、下記の一行をバッチ内に加えたら「終了時にウィンドウを閉じる」の設定が無効になってしまいました。 del test.pif 動作的な希望としては、「バッチ実行後は自動でDOS窓を閉じる」と「ショートカットを生成しない」の2点をクリアしたいのですが。 良い方法がありましたらどうぞ宜しくお願い致します。

  • バッチファイルで無限ループ

    以下の1行だけを書いたバッチファイルを作って、ダブルクリックすると書いたコマンドがDOS窓で無限に実行されてどんどんスクロールしていきます。 route add 172.22.0.0 mask 255.255.0.0 192.168.75.2 metric 1 あらかじめDOS窓を開いておいてこのバッチファイルをドロップすれば正しく実行されるのですが、何故この様なことになるのでしょうか。

  • DOSコマンドについて

    前回に引き続き問題発生です。 EROORLEVELが分岐しません。何故でしょう?(下例) ------------------------------------------ C:\>ECHO %ERRORLEVEL% 1 C:\>IF ERRORLEVEL 0 ECHO 0000 0000 C:\>IF ERRORLEVEL 1 ECHO 1111 1111 C:\>IF ERRORLEVEL 2 ECHO 22222 C:\> ------------------------------------------ 2は判断できているみたいなんですが0と1ではどちらもECHOしています。 ちなみに2・1・0のならびに変えても同じ様な結果です。 いろいろ調べてみたんですがわかりません。どなたか御教示ねがいます。 Microsoft(R) Windows NT DOS (C)Copyright Microsoft Corp 1990-1996.

  • DOSバッチで文字数カウント

    DOSバッチでファイル内の文字数をカウントする方法をご存じの方はいませんでしょうか?? UNIXでいうところの「wc -c」です。 使用OSは、Windows2003ServerとWindowsXPです。 ユーティリティーなどは導入できず、DOSバッチで実現しなくてはなりません。 どなたかご助力をお願いいたします。

  • バッチファイルについて

    バッチファイルを作成して、スカイプとMSNメッセンジャーの同時起動はできるのですが、そのあとに「C:\Windows\system32\cmd.exe」というコマンドプロンプトの画面が3つ出てしまうのですが、これはアプリ起動の後に自動的に消せないものなのでしょうか?教えてください。 (作成したバッチファイル) start CD C:\PROGRA~1\Skype\Phone skype.exe start CD C:\PROGRA~1\"Windows Live"\Messenger msnmsgr.exe exit; skype.exeの前にexit;と書いた場合、MSNが起動しませんでした。