xcorp::When it rains, it pours.

"The nice thing about rain," said Eeyore, "is that it always stops. Eventually."

コンソールアプリの標準出力と標準エラー出力をリダイレクトして取得

ntohさんからも,

これってWin32の時代から簡単そうですげー面倒でしたよね。
面倒なので、毎回ファイルに書き出して読み込んでいた俺。

と同情されてしまうプレイ。
そういや,VC でも書いてたなと思い出し,ソースを引っ張り出してみる。

bool CHoge::ExecuteCommand(CString &cmd)
{
    BOOL                ret_code;
    DWORD               file_size;
    TCHAR               cmd_buf[_MAX_PATH];
    STARTUPINFO         si;
    PROCESS_INFORMATION pi;
    SECURITY_ATTRIBUTES sa;

    sa.nLength              = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle       = TRUE;
    sa.lpSecurityDescriptor = NULL;
    m_FileHdl               = ::CreateFile(m_FileName, GENERIC_READ | GENERIC_WRITE,
                                           FILE_SHARE_READ | FILE_SHARE_WRITE, sa,
                                           CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if (m_FileHdl == INVALID_HANDLE_VALUE) {
        return false;
    }   /* end-if(m_FileHdl == INVALID_HANDLE_VALUE) */

    file_size	= ::GetFileSize(m_FileHdl, NULL);
    ::SetFilePointer(m_FileHdl, file_size, NULL, FILE_BEGIN);

    ::ZeroMemory(&si, sizeof(STARTUPINFO));
    ::GetStartupInfo(&si);
    si.wShowWindow = SW_HIDE;
    si.hStdOutput  = m_FileHdl;
    si.hStdError   = m_FileHdl;
    si.hStdInput   = ::GetStdHandle(STD_INPUT_HANDLE);
    si.dwFlags     = STARTF_USESTDHANDLES;
    ::strcpy(cmd_buf, cmd);
    ret_code       = ::CreateProcess(NULL, cmd_buf, &sa, NULL, TRUE, NORMAL_PRIORITY_CLASS,
                                     NULL, NULL, &si, &pi);

    if (ret_code == FALSE) {
        ::CloseHandle(m_FileHdl);
        return false;
    }	/* end-if(ret_code == FALSE) */

    ::CloseHandle(m_FileHdl);
    ::CloseHandle(pi.hThread);
    ::WaitForSingleObject(pi.hProcess, INFINITE);
    ::CloseHandle(pi.hProcess);

    return true;
}   /* end of CHoge::ExecuteCommand() */

やっぱファイルに落としてたね。えへへ。