プロが教える店舗&オフィスのセキュリティ対策術

環境:Windows2000,BorlandC++Builder6

system()関数によりDOS上で動く実行ファイルの呼び出し
をしています。その際,DOS窓が一瞬出ます。
どうにかDOS窓が出ないようにしたいのですが,
何か方法はないでしょうか?
どなたか分かりましたら教えて下さいm(__)m

A 回答 (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 で取得できます。
    • good
    • 3
この回答へのお礼

>"CMD.EXE /C TEST1.EXE <test.txt >r.txt"
前何度もやってダメだと思っていたのですが,試しにもう一回試してみました。
できました^^;ShellExecuteExを使ってもう一度プログラムを組んでみようと思います。
どうもありがとうございましたm(__)m

お礼日時:2004/01/28 17:38

>しかし,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”このような引数を入れると,
思った通りのことができないのです。
何度も答えて頂きありがとうございます。

補足日時:2004/01/28 14:48
    • good
    • 0

System() じゃなくて、ShellExecute()、あるいは ShellExecuteEx() を使用すればできるんじゃないでしょうか。

この回答への補足

回答して頂きありがとうございます。
初め,ShellExecute()やShellExecuteEx()で
プログラムを組んでいて,確かにDOS窓は非表示に
なります。しかし,DOSで動作する実行ファイルを
呼び出した後の処理ができなくなってしまうので,
最終的にSystem()を使うことにしたのです。
System()を使う限り,DOS窓が表示されるのは
仕方ないことなのでしょうか…?

補足日時:2004/01/27 18:10
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています