c/c++运行命令行程序并取返回值 【转】

来源:赵克立博客 分类: C/C++ 标签:C/C++发布时间:2018-11-13 19:28:44最后更新:2018-12-11 10:49:01浏览:1980
版权声明:
本文为博主学习过程中整理发布,如有侵权请告知
更新时间:
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);
}



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python