VC执行批处理文件并获取结果输出到RichEdit控件

来源:互联网 发布:linux网页编程工具 编辑:程序博客网 时间:2024/05/17 23:51

VC++创建新的线程执行Windows批处理程序,并将批处理执行输出重定向输出到RichEdit控件中,

代码示例如下:

void CTestCMDDlg::OnBnClickedOk(){CString str;//ExecCmd();std::thread t(ThreadProc, this);t.detach();//CDialogEx::OnOK();}void CTestCMDDlg::ThreadProc(void* p){CTestCMDDlg *dlg = (CTestCMDDlg*)p;dlg->ExecCmd();}int CTestCMDDlg::ExecCmd(){SECURITY_ATTRIBUTES sa;HANDLE hRead, hWrite;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle = TRUE;sa.lpSecurityDescriptor = NULL;if (!CreatePipe(&hRead, &hWrite, &sa, 0)){DWORD dErr = GetLastError();CString szInfo;szInfo.Format(_T("Fail to Create Pipe Error: %d"), dErr);MessageBox(szInfo);return -1;}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;TCHAR szCommand[] = _T("test.bat");if (!CreateProcess(NULL, szCommand, NULL, NULL, TRUE, NULL, NULL, NULL, &si,&pi)){MessageBox(_T("Fail to create process"));return -2;}CloseHandle(hWrite);char buffer[128] = { 0 };DWORD bytesRead;for (;;){if (ReadFile(hRead, buffer, 128, &bytesRead, NULL) == NULL || bytesRead==0){break;//读取结束}else{TCHAR szShow[128] = { 0 };MultiByteToWideChar(CP_ACP, NULL, buffer, 128, szShow, 128);AppendText(szShow);}}return 0;// __super::OnOK();  }void CTestCMDDlg::AppendText(CString str){m_ctrlRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);m_ctrlRichEdit.SetSel(-1, -1);m_ctrlRichEdit.ReplaceSel((LPCTSTR)str);}


0 0