- ベストアンサー
DOS窓の非表示
環境:Windows2000,BorlandC++Builder6 system()関数によりDOS上で動く実行ファイルの呼び出し をしています。その際,DOS窓が一瞬出ます。 どうにかDOS窓が出ないようにしたいのですが, 何か方法はないでしょうか? どなたか分かりましたら教えて下さいm(__)m
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なるほど、そっちでしたか。(もしかしたら、リダイレクトのことかも、という気はしてたのですが。) リダイレクトはコマンドプロセッサ( WindowsNT/2000/XP では CMD.EXE、Windows95/98/ME では COMMAND.COM )がやっている仕事なので、ShellExecute などで実行させるなら、 "CMD.EXE /C TEST1.EXE <test.txt >r.txt" のようにしないといけないですね。 ( /C については、コマンドプロンプトで CMD /? で見てください。) CMD.EXE or COMMAND.COM のパスは環境変数 COMSPEC で取得できます。
その他の回答 (2)
- tsukasa-12r
- ベストアンサー率65% (358/549)
>しかし,DOSで動作する実行ファイルを呼び出した後の処理ができなくなってしまうので というのは、呼び出した実行ファイルの終了コードを取得したいということでしょうか?もしそうでしたら、ShellExecuteEx() でも終了コードを取得できると思いますよ。SHELLEXECUTEINFO のメンバ hProcess にプロセスハンドルが返ってくると思うので、 SHELLEXECUTEINFO sei; sei.cbSize = sizeof( SHELLEXECUTEINFO ); sei.nShow = SW_HIDE; ... ShellExecuteEx( &sei ); WaitForSingleObject( sei.hProcess, INFINITE ); GetExitCodeProcess( sei.hProcess, &dwExitCode ); としてやれば終了コードが取得できると思います。
補足
こんにちわ。 回答頂きありがとうございます。説明不足で申し訳ありませんm(__)m DOSで動作する実行ファイルを呼び出した後の処理というのは, 呼び出した実行ファイルの終了コードを取得したいということではなく, 標準入出力のリダイレクトです。 例えば,ShellExecuteEx() 等でDOSを呼び出した場合, ”<test.txt >r.txt”このような引数を入れると, 思った通りのことができないのです。 何度も答えて頂きありがとうございます。
- tsukasa-12r
- ベストアンサー率65% (358/549)
System() じゃなくて、ShellExecute()、あるいは ShellExecuteEx() を使用すればできるんじゃないでしょうか。
補足
回答して頂きありがとうございます。 初め,ShellExecute()やShellExecuteEx()で プログラムを組んでいて,確かにDOS窓は非表示に なります。しかし,DOSで動作する実行ファイルを 呼び出した後の処理ができなくなってしまうので, 最終的にSystem()を使うことにしたのです。 System()を使う限り,DOS窓が表示されるのは 仕方ないことなのでしょうか…?
お礼
>"CMD.EXE /C TEST1.EXE <test.txt >r.txt" 前何度もやってダメだと思っていたのですが,試しにもう一回試してみました。 できました^^;ShellExecuteExを使ってもう一度プログラムを組んでみようと思います。 どうもありがとうございましたm(__)m