MFC与CMD信息的传递与返回
HANDLE hRead,hWrite;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符
sa.bInheritHandle = TRUE; //创建的进程继承句柄
if (!CreatePipe(&hRead,&hWrite,&sa,0)) //创建匿名管道
{
MessageBox("CreatePipe Failed!","提示",MB_OK | MB_ICONWARNING);
return;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite; //新创建进程的标准输出连在写管道一端
// si.wShowWindow = SW_HIDE; //隐藏窗口
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
char cmdline[200];
CString tmp,stredit2;
GetDlgItemText(IDC_EDIT2,stredit2); //获取编辑框中输入的命令行
tmp.Format("cmd /c %s",stredit2);
sprintf(cmdline,"%s",tmp);
if (!CreateProcess(NULL,
cmdline,
NULL,
NULL,
TRUE,/*打开句柄都将被子进程继承,信息的交互*/
CREATE_NO_WINDOW,/*这里不为该进程创建一个控制台窗口,不显示cmd执行窗口*/
NULL,
NULL,
&si,&pi)) //创建子进程
{
MessageBox("CreateProcess Failed!","提示",MB_OK | MB_ICONWARNING);
return;
}
CloseHandle(hWrite); //关闭管道句柄
char buffer[4096] = {0};
CString strOutput;
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL) //读取管道
break;
strOutput += buffer;
SetDlgItemText(IDC_EDIT1,strOutput); //显示输出信息到编辑框,并刷新窗口
UpdateWindow();
Sleep(100);
}
CloseHandle(hRead);
MFC调用bat文件
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
if (CreateProcess("循环执行.bat",// 循环执行.bat位于工程所在目录下
NULL,
NULL,
NULL,
NULL,
NULL,// 这里为该进程创建一个控制台窗口
NULL,
NULL,
&si, &pi))
{
// WaitForSingleObject(pi.hProcess, INFINITE);// 等待bat执行结束
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
两者CreateProcess的不同
1: if(!CreateProcess(NULL,cmdline,NULL,NULL,TRUE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi)) //创建子进程
2:if (CreateProcess(“循环执行.bat”,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si, &pi)) // 循环执行.bat位于工程所在目录下
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)