用C ++读取另一个进程'stdout

时间:2010-11-04 01:53:27

标签: c++ windows stdout

在Windows中,有没有办法在C ++中启动进程,然后在完成后读取它在stdout中吐出的内容?必要时,必须使用提升的权限(在Vista或更高版本上)运行该过程。

我正在使用ShellExecuteEx()来启动进程并运行while循环,直到GetExitCodeProcess()不再通过lpExitCode参数返回STILL_ACTIVE(在每次迭代期间,WaitForSingleObject()调用执行100毫秒的等待)。

4 个答案:

答案 0 :(得分:3)

没有简单的方法可以做到这一点。

使用ShellExecuteEx()谓词调用runas会向 AppInfo NT服务发送一条RPC消息,然后从提升的会话中运行该应用程序。没有API可以轻松地将提升过程的输入/输出连接到您的应用程序。

托马斯·赫鲁斯卡(Thomas Hruska)在他的The Code Project article中介绍了他解决这个问题的CreateProcessElevated()函数的实现。

而不是直接运行提升的程序CreateProcessElevated()依赖于另一个可执行文件,它接收 stdin,stdout,stderr 命名管道的名称,并在调用{之前在提升的会话中重新创建它们的句柄{1}}。

答案 1 :(得分:2)

您应该使用CreateProcess替换您对ShellExecuteEx的使用。 lpStartupInfo参数允许std in和std输出进程的句柄。只需使用您传递的CreatePipe作为参数创建一个匿名管道。这个MSDN article有一个如何执行此操作的示例。

答案 2 :(得分:0)

您需要为子进程创建命名管道。 This MSDN article解释并拥有代码示例。

你应该能够从中获得它。

答案 3 :(得分:0)

您是否可以使用CreateProcess / ShellExecuteEx来执行带有重定向的stdout / stderr的cmd shell,从而调用您的进程?

“cmd / c YourProcess.exe {parameters}”等?