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);
}