• ベストアンサー

ShellExecuteでDOSコマンド実行したら...

VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを 実行したいのですが、うまくいきません。 1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW); ...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、 なにも実行されません。 2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW); ...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。 3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW); ...としてもファイルが作られず、2.と全く同じ結果になってしまいます。 これはどうしてこのような現象が起きるのでしょうか? DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。 あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

3.の部分について。 VBで似たような事をしたときのことですが。 「COMMAND/C DIR > C:\DIR.TXT」とやら無いと リダイレクトの結果が残せませんでした。 参考になりましたら。

ystk
質問者

お礼

回答ありがとうございます。 ご指摘の通りdirの前に /Kやら/Cやらオプションを付けると それだけで1も2も3も全てうまくいくようです(ナゼだ???) 結局良く分からないので、ShellExecute()は止めて、system()関数(VBにもあるのかな?)を使うようにしました。 ありがとうございました。

その他の回答 (3)

noname#18951
noname#18951
回答No.4

command.comのオプションをご覧ください。Windows NT/2000の場合は cmd.exeをお使いになることをお勧めします。command.comで実現されて いるコマンドを実行させるためには/cスイッチを使います。 ShellExecute(handle, "Open"          , "command.com" , "/c dir /? > out.txt"             , SW_SHOW); としてみてください。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

「チャイルドプロセス」がキーワードとなるような話を思い出しました。 DIRはDOSの内部コマンドで実行するのはcommand.comです。 リダイレクトで結果保存するのもcommand.comであるため 表示するための領域が必要なのでしょう。 DOSのバッチ処理を作成する際、「複数のバッチ処理を呼ぶバッチ」を実現する ために必要でした。(今は Callが使えるから)

  • bir
  • ベストアンサー率44% (11/25)
回答No.1

DOS窓を閉じないようにするには、command.comに/kオプションを付けて 起動すればOKです。↓こんな感じです。  ShellExecute(hWnd, "open", "command.com", "/k dir", NULL, SW_SHOWNORMAL); (WinNT/2Kはcmd.exeを起動したほうが良いと思います) 1~3の現象について何故そうなるかはよくわかりませんが、おそらく command.comの起動オプションの書式エラーになっているだけだと思います。 DOS窓で command.com /? としてヘルプを見ると、  COMMAND [[ドライブ:]パス] [デバイス] ... のようになっていますが、"dir"文字列がドライブ、パスとして認識されて いるのかもしれません。 2.についても、dirコマンドのヘルプではなく、command.comのヘルプが 表示されているはずです。 (3.のファイルに出力されない理由はわかりません)

ystk
質問者

お礼

回答ありがとうございます。 /K オプション COMMAND.COMのヘルプにありましたね。回答を頂いて気づきました。(^^;) そこで色々試してみたのですが、 dirの前に /Kやら/Cやらオプションを付けると それだけで1も2も3も全てうまくいくようです(ナゼだ???) 結局良く分からないので、ShellExecute()は止めて、system()関数を使うようにしました。 ありがとうございました。

関連するQ&A