如何重定向DOS窗口里的输出内容至我的程序界面里?
用CreateProcess 调用了一个DOS下的命令,希望将它运行中的所有提示信息都在我的界面里反应。如何实现? 改变了CreateProcess里的StartupInfo那一选项也不行。
BOOL CMyTestDlg::RunAndRedirectOutput(CString CommandLine, CString OutputFile)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
SECURITY_ATTRIBUTES SecAtrrs;
HANDLE hAppProcess, hAppThread, hOutputFile;
TRY
{
memset(&SecAtrrs, 0, sizeof(SecAtrrs));
SecAtrrs.nLength = sizeof(SecAtrrs);
SecAtrrs.lpSecurityDescriptor = NULL;
SecAtrrs.bInheritHandle = TRUE;
hOutputFile = CreateFile( (LPCTSTR)OutputFile,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&SecAtrrs,
CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY,
0);
if (hOutputFile != INVALID_HANDLE_VALUE)
{
memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.dwFlags = NULL;//STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
StartupInfo.wShowWindow = SW_NORMAL; //HIDE;
StartupInfo.hStdOutput = hOutputFile;
StartupInfo.hStdError = hOutputFile;
if(CreateProcess(NULL,
(LPTSTR)(LPCTSTR)CommandLine,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE|REALTIME_PRIORITY_CLASS,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
hAppProcess = ProcessInfo.hProcess;
hAppThread = ProcessInfo.hThread;
}
}
}
CATCH(CException, e)
{
char lpError[1000];
int nMaxError = 1000;
e->GetErrorMessage(lpError, nMaxError);
MessageBox(lpError);
}
END_CATCH
if (hOutputFile) CloseHandle(hOutputFile);
if (hAppThread) CloseHandle(hAppThread);
if (hAppProcess) CloseHandle(hAppProcess);
return TRUE;
}