コンソールアプリの標準出力と標準エラー出力をリダイレクトして取得
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() */
やっぱファイルに落としてたね。えへへ。