c/c++运行命令行程序并取返回值 【转】
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
2018-12-11 10:49:01
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章
#include <string> #include <windows.h> #include <tchar.h> //定义tstring类型 #ifndef __TSTRING__ #define __TSTRING__ #ifdef _UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif #endif std::wstring CharToWchar(const char* c, size_t m_encode = CP_ACP) { std::wstring str; int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0); wchar_t* m_wchar = new wchar_t[len + 1]; MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len); m_wchar[len] = '\0'; str = m_wchar; delete m_wchar; return str; } std::string WcharToChar(const wchar_t* wp, size_t m_encode = CP_ACP) { std::string str; int len = WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), NULL, 0, NULL, NULL); char *m_char = new char[len + 1]; WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), m_char, len, NULL, NULL); m_char[len] = '\0'; str = m_char; delete m_char; return str; } tstring ExeCmd(const TCHAR * pszCmd) { //创建匿名管道 SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE hRead, hWrite; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { return _T(""); } //设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWrite) STARTUPINFO si = { sizeof(STARTUPINFO) }; GetStartupInfo(&si); si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; si.hStdError = hWrite; si.hStdOutput = hWrite; //启动命令行 PROCESS_INFORMATION pi; if (!CreateProcess(NULL, (TCHAR *)pszCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { return _T(""); } //立即关闭hWrite CloseHandle(hWrite); //读取命令行返回值 std::string strRet; char buff[1024] = { 0 }; DWORD dwRead = 0; while (ReadFile(hRead, buff, 1024, &dwRead, NULL)) { strRet.append(buff, dwRead); } CloseHandle(hRead); #ifdef _UNICODE return CharToWchar(strRet.c_str()); #else return strRet; #endif } int main() { TCHAR pszCmdLine[] = _T("ldconsole"); tstring strr = ExeCmd(pszCmdLine); MessageBox(NULL, strr.c_str(), L"标题", 0); }