//运行一个CMD命令,并返回运行结果
BOOL RunCmd(CString cstrCmd,CString &cstrResult)
{
if(cstrCmd.IsEmpty())
{
return TRUE;
}
cstrCmd="cmd /k"+cstrCmd;//加上"cmd /k"是为了能执行类似dir的命令 应该用/c ,/k cmd 进程不会关闭
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
//创建命名管道
if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
//MessageBox("Error On CreatePipe()");
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;//数据输出用的文件句柄
si.hStdOutput = hWrite;//数据输出用的文件句柄
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL,(LPSTR)cstrCmd.GetString()//执行cmd命令,并在命名中管道中写入cmd命令返回的串
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
//可以指定程序的启动路径,si前面的那个参数,这里使用默认的。
//MessageBox("Error on CreateProcess()");
return FALSE;
}
/*if(WaitForSingleObject(pi.hProcess, INFINITE)==WAIT_FAILED)//这里决定是否要等整个命令执行完,如ping等耗时较多的命令.
{
//MessageBox("Failed!");
return FALSE;
}*/
CloseHandle(hWrite);
char buffer[4096] ={0} ;
DWORD bytesRead;
BOOL bRet;
cstrResult="";
do
{
memset(buffer,0,4096);
bRet=ReadFile(hRead,buffer,4096,&bytesRead,NULL);//从命名管道中读取数据
if(bRet)
{
cstrResult += buffer;
}
} while (bRet&&bytesRead);
CloseHandle(hRead);
return TRUE;
}
调用命令行程序并获取返回信息<a target=_blank href="http://www.cnblogs.com/acloud/archive/2012/08/30/2663395.html">http://www.cnblogs.com/acloud/archive/2012/08/30/2663395.html</a>
std::string ExeCmd(const char * pszCmd)
{
//创建匿名管道
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return "";
} //设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到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, (char *)pszCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
return "";
} //立即关闭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); return strRet;
}
//运行一个应用程序,可以选择是否等待
bool RunApplication(LPCTSTR lpApplicationName, LPCTSTR lpCommandLine, WORD wShowWindow = SW_NORMAL, bool bWaitAppExit = false);
bool RunApplication(LPCTSTR lpApplicationName, LPCTSTR lpCommandLine, WORD wShowWindow, bool bWaitAppExit)
{
TCHAR tszCommandLine[MAX_PATH] = { 0 };
if (lstrcmp(lpApplicationName,_T(""))!=0)
{
lstrcpy(tszCommandLine, lpApplicationName);
lstrcat(tszCommandLine, _T(" "));
}
lstrcat(tszCommandLine, lpCommandLine);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags |= STARTF_USESHOWWINDOW;
si.wShowWindow = wShowWindow;
BOOL bRet = CreateProcess(NULL, //可执行模块名 No module name (use command line).
tszCommandLine, // 命令行字符串
NULL, // 进程的安全属性
NULL, // 线程的安全属性
FALSE, // 句柄继承标志
NORMAL_PRIORITY_CLASS, // 创建标志
NULL, // 指向新的环境块的指针
NULL, // 指向当前目录名的指针
&si, // 指向启动信息结构的指针
&pi); // 指向进程信息结构的指针
if (!bRet)
{
return false;
}
// Wait until child process exits.
if (bWaitAppExit)
{
if (WaitForSingleObject(pi.hProcess, INFINITE)==WAIT_FAILED)//这里决定是否要等待
{
return false;
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return true;
}
<pre name="code" class="cpp">//SHELLEXECUTEINFO 和 ShellExecuteEx 使用 http://blog.csdn.net/weilely123/article/details/17393805
bool execute(CString fileName, CString args, CString baseDir, bool wait)
{
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFOW) };
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
sei.lpFile = fileName;//可执行文件名字
sei.lpParameters = args;//参数
sei.lpDirectory = baseDir;//目录
sei.nShow=SW_SHOW;
if (!ShellExecuteEx(&sei)) {
return false;
}
if (wait) {
HANDLE hProcess = sei.hProcess;
if (hProcess != 0) {
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
}
}
return true;
}