11

CreateProcess() を使用して、GUI アプリケーションから Windows で外部コンソール アプリケーションを実行しています。エラーがあったかどうかを知るために、何らかの方法で出力を収集したいと思います。hStdOutputで何かをしなければならないことはわかっていますが、何を理解していません。私は c++ を初めて使用し、経験の浅いプログラマーであり、実際にはハンドルをどうするか、またはパイプに火をつける方法を知りません。

出力をある種の変数 (またはファイル) に取得するにはどうすればよいですか?

これは私が今持っているものです:

void email::run(string path,string cmd){


    WCHAR * ppath=new(nothrow) WCHAR[path.length()*2];
    memset(ppath,' ',path.length()*2);
    WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2];
    memset(pcmd,' ',cmd.length()*2);

    string tempstr;


    ToWCHAR(path,ppath);  //creates WCHAR from my std::string
    ToWCHAR(cmd,pcmd);

    STARTUPINFO info={sizeof(info)};
    info.dwFlags = STARTF_USESHOWWINDOW;    //hide process

    PROCESS_INFORMATION processInfo;

    if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo))
        {
        ::WaitForSingleObject(processInfo.hProcess, INFINITE);

        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
        }

    delete[](ppath);
    delete[](pcmd);
}

このコードは、おそらくまともなプログラマなら誰でも悲鳴を上げるでしょうが、(言うべきではありません:) 動作します ;-)

質問: hStdOutput を使用して出力をファイル (たとえば) に読み取るにはどうすればよいですか?

4

1 に答える 1

2

Microsoft のナレッジ ベースには、子コンソール プロセスの出力をキャプチャする方法を示す例があります。基本的な原則は、親プロセスがパイプ (リダイレクトする標準ハンドルごとに 1 つ) を作成し、そのハンドルを CreateProcess に渡すことです。

これが機能するために子プロセスを変更する必要はありません。これは、子のソースを制御できない場合に重要です。

詳細:リダイレクトされた標準ハンドルを使用してコンソール プロセスを生成する方法

于 2013-04-23T21:43:00.977 に答える