VC++6.0(SP5)を使って、コマンドプロンプトのような処理を作成しています。
1.CreateProcess()でMS-DOSプロンプトを起動
2.CreatePipe()で実行コマンドの読み取り/終了監視スレッド用ハンドル作成
3.CreateThread()で実行コマンドの読み取り/終了監視スレッド作成
4.WriteFile()、ReadFile()を使っています。
'Dir'コマンド等を実行した際、通常プロンプトに表示されるメッセージを
読み取れてエディットボックスに表示できるのですが、異常/正常に関わらず
終了した時を取得したいのですが・・・。
(詳細)
1.WriteFile()を使って'Dir'コマンド実行
2.実行コマンドの出力が完了←この時点でコマンドプロンプトを終了させたい
※WriteFile()関数の実行終了ではなく、'Dir'コマンド実行終了を知りたい
何方かご教授お願いします。
No.1ベストアンサー
- 回答日時:
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・・・など色々なのですが。
お解りでしたら引き続きご教授をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
- その他(コンピューター・テクノロジー) (コマンドプロンプト)コマンドプロンプトのactiveについて 2 2022/07/16 17:21
- その他(プログラミング・Web制作) DOSコマンドに詳しい方、お知恵をお貸しください 5 2022/11/04 20:55
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- Windows 10 windowsの回復ドライブや復元ポイントを使用した場合の戻る位置を教えてください。 5 2023/08/19 14:52
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトが実行中か...
-
バッチファイルでキー操作を行う。
-
ExcelVBAでDOSコマンドの標準出...
-
ttlで戻り値を取得する方法
-
PowerShell実行結果をデスクト...
-
VBユーザーフォームで時間入力
-
TEXの表の位置が・・・
-
エクセル コマンドボタンでリセ...
-
Tera Term Proに関する質問です。
-
コマンドプロンプトについて
-
jupyter notebookが開けません!
-
別のユーザーフォームのコマン...
-
シェルスクリプト
-
EEPROMのデータの初期化について
-
makeコマンドのエラー
-
コマンドキーがないんですけど...
-
[WSH|JS|VB] telnetコマンドの...
-
Excel VBA コマンドライン(MS-...
-
VB6で、コマンドボタン自身の色...
-
tcl/tkで標準出力に出される値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイルでキー操作を行う。
-
コマンドプロンプトが実行中か...
-
コマンドプロンプトで表示が多...
-
ttlで戻り値を取得する方法
-
VBユーザーフォームで時間入力
-
Tera Term Proに関する質問です。
-
別のユーザーフォームのコマン...
-
TEXの表の位置が・・・
-
RTX1100の削除コマンド
-
コンボボックス(最終行取得)
-
コマンドキーがないんですけど...
-
コマンドプロンプトですべてのU...
-
ルーターにつながっている全て...
-
文字の点滅はどうやるのですか?
-
EEPROMのデータの初期化について
-
シリアル通信でコマンドを送信...
-
jupyter notebookが開けません!
-
makeコマンドのエラー
-
アンドロイドでも、robocopyは...
-
HEXから元に戻すには
おすすめ情報