2010-04-20 84 views
6

我使用CreateProcess()从我的GUI应用程序在Windows中运行外部控制台应用程序。我想以某种方式收集输出以了解是否有错误。现在我知道我必须用hStdOutput做些什么,但我不明白是什么。我是新来的C++和一个没有经验的程序员,我实际上不知道如何处理或如何点亮管道。使用句柄从CreateProcess()收集输出

如何获得某种变量(或文件)的输出?

这是我有一个时刻:

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

相关:[?启动与标准输入标准输出一个exe /过程和stderr](http://stackoverflow.com/questions/5485923/launch-an-exe-process-with-stdin -stdout和 - 标准错误/ 39648986)。另外,请参阅[tiny-process-library](https://github.com/eidheim/tiny-process-library),这非常方便。 – Delgan 2016-09-22 21:31:04

回答

-2

BOOL WINAPI GetExitCodeProcess( __in HANDLE hProcess, __out LPDWORD lpExitCode );

传递processInfo.hProcess获取进程的退出代码。

+0

他想获得输出,而不是退出代码。 – fleed 2017-09-21 21:36:00

3

Microsoft在其知识库中有一个示例,演示如何捕获子控制台进程的输出。基本原则是父进程创建管道(每个标准句柄重定向一个)并将句柄传递给CreateProcess。

子进程不需要修改就可以工作,如果您无法控制子进程的源,这一点很重要。

的更多信息:How to spawn console processes with redirected standard handles