我正在使用CreateProcess()从我的GUI应用程序在Windows中运行外部控制台应用程序。我想以某种方式收集输出,以了解是否有错误。现在我知道我必须用hStdOutput做一些事情,但我不明白是什么。我是c ++和没有经验的程序员的新手,我实际上不知道如何处理句柄或如何点亮管道。
如何将输出转换为某种变量(或文件)?
这就是我现在所拥有的:
void email::run(string path,string cmd){
WCHAR * ppath=new(nothrow) WCHAR[path.length()*2];
memset(ppath,' ',path.length()*2);
WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2];
memset(pcmd,' ',cmd.length()*2);
string tempstr;
ToWCHAR(path,ppath); //creates WCHAR from my std::string
ToWCHAR(cmd,pcmd);
STARTUPINFO info={sizeof(info)};
info.dwFlags = STARTF_USESHOWWINDOW; //hide process
PROCESS_INFORMATION processInfo;
if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo))
{
::WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
delete[](ppath);
delete[](pcmd);
}
这段代码可能让任何体面的程序员尖叫,但(我甚至不应该说:)它有效; - )
问题:如何使用hStdOutput读取文件的输出(例如)?
答案 0 :(得分:5)
您想要查看此MSDN示例代码:http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx
答案 1 :(得分:3)
Microsoft在其知识库中有一个示例,演示如何捕获子控制台进程的输出。基本原则是父进程创建管道(每个标准句柄一个用于重定向)并将句柄传递给CreateProcess。
不需要修改子进程以使其工作,如果您无法控制子进程,这很重要。
更多信息:How to spawn console processes with redirected standard handles
答案 2 :(得分:-3)
BOOL WINAPI GetExitCodeProcess( __在HANDLE hProcess中, __out LPDWORD lpExitCode );
传递processInfo.hProcess以获取进程的退出代码。