使用句柄从 CreateProcess() 收集输出

Posted

技术标签:

【中文标题】使用句柄从 CreateProcess() 收集输出【英文标题】:Using a handle to collect output from CreateProcess() 【发布时间】:2010-04-20 10:21:42 【问题描述】:

我正在使用 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 将输出读取到文件(例如)?

【问题讨论】:

相关:launch an exe/process with stdin stdout and stderr?。也可以看tiny-process-library,很方便。 【参考方案1】:

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

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

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

【讨论】:

以上是关于使用句柄从 CreateProcess() 收集输出的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何使用 CreateProcess 来处理进程?

windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄

win32进程概念之句柄表,以及内核对象.

将 STARTF_USESTDHANDLES 标志与 CreateProcess() 一起使用时将套接字传递给子进程时出错

CreateProcess函数回来的进程ID和任务管理器的不同

delphi获取窗体的句柄