- 締切済み
スレッド処理内での終了結果を知りたい
VC++6.0(SP5)を使って、コマンドプロンプトのような処理を作成しています。 1.CreateProcess()でMS-DOSプロンプトを起動 2.CreatePipe()で実行コマンドの読み取り/終了監視スレッド用ハンドル作成 3.CreateThread()で実行コマンドの読み取り/終了監視スレッド作成 4.WriteFile()、ReadFile()を使っています。 'Dir'コマンド等を実行した際、通常プロンプトに表示されるメッセージを 読み取れてエディットボックスに表示できるのですが、異常/正常に関わらず 終了した時を取得したいのですが・・・。 (詳細) 1.WriteFile()を使って'Dir'コマンド実行 2.実行コマンドの出力が完了←この時点でコマンドプロンプトを終了させたい ※WriteFile()関数の実行終了ではなく、'Dir'コマンド実行終了を知りたい 何方かご教授お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- akkun2k
- ベストアンサー率71% (5/7)
Dirの様な機能であれば、FindFirstFile(), FindNextFile(), FindClose()などを組み合わせて作成した方がいいと思いますが・・・。 ソースを見ていないので何とも言えませんが、 1.パイプを作成。 CreatePipe(hRead,hWrite,セキュリティ属性構造体へのポインタ,サイズ) 2.スタートアップ情報にパイプのハンドルを設定。 STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.hStdOutput = hWrite; si.hStdInput = 入力ハンドル ・・・以下略・・・ 3.CMD.EXEをCreateProcess()で実行。 4.入力ハンドルにWriteFile()でDIRコマンドを出力。 5.パイプのデータをチェック。 PeekNamedPipe(hRead, NULL, 0, NULL, &dwOutputSize, NULL); 6.dwOutputSizeが0以上なら ReadFile(hRead, バッファ, dwOutputSize, &dwReadSize, NULL); で結果を取得、リストに表示、5.に戻る。0なら終了。 ・・・という感じでは駄目でしょうか? 丁寧に書くと長いコーディングになってしまうので省略しています。
補足
ご教授ありがとうございます。 MFCでコマンドプロンプトのような機能を可能にできないものでしょうか? 長くなりますが、ソースはこんな感じです。 1.パイプ作成 CreatePipe(&hPipeInR, &hPipeInW, &sa, 0)←入力パイプハンドル CreatePipe(&hPipeOutR, &hPipeOutW, &sa, 0)←出力パイプハンドル 2.スタートアップ情報にパイプのハンドルを設定。 ::GetStartupInfo( &si); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdInput = hPipeInR; si.hStdOutput = hPipeOutW; si.hStdError = hPipeOutW; 3.CMD.EXEをCreateProcess()で実行。 CreateProcess(NULL,(LPTSTR)(LPCTSTR)GetSysDir(),NULL,NULL,TRUE,0, NULL,NULL,&si,&pi) 4.読み取りスレッド開始。dwBytesReadが0以上なら ReadFile(hPipeOutR, lpBuffer, 4095, &dwBytesRead, NULL) で結果を取得、Edit Boxに表示 5.プロセス終了監視スレッド開始。 ::WaitForSingleObject(hProcess, INFINITE); 6.入力ハンドルにWriteFile()でコマンドを出力。 WriteFile(hPipeInW, lpBuffer,strlen(lpBuffer),&lngLength, NULL) 項目6で実行したコマンド(lpBuffer)終了時点を受けてMessageBoxを 起動させたいのですが、どうしてもWriteFile()の実行結果時点で表示されます。 因みにlpBufferはDir、notepad、cd・・・など色々なのですが。 お解りでしたら引き続きご教授をお願いします。