在Windows中,有没有办法在C ++中启动一个进程,然后在完成之后读取它向stdout吐出的内容? 必要时,必须使用提升的权限(在Vista或更高版本)运行该进程。
我正在使用ShellExecuteEx()来启动进程并运行while循环,直到GetExitCodeProcess()不再通过lpExitCode参数(每次迭代期间WaitForSingleObject()调用等待100毫秒的等待)返回STILL_ACTIVE)。
有没有简单的方法来做到这一点。
用runas
动词调用ShellExecuteEx()
向AppInfo NT服务器发送RPC消息,然后从提升的会话中运行应用程序。 没有API可以轻松地将升级过程的输入/输出连接到您的应用程序。
Thomas Hruska在他的“代码项目”文章中介绍了他的CreateProcessElevated()
函数的实现来解决这个问题。
而不是直接运行提升的程序CreateProcessElevated()
依赖于另一个可执行文件,它接收标准输入,stdout,stderr命名管道的名称,并在调用CreateProcess()
之前在提升的会话中重新创建它们的句柄。
你应该用CreateProcess替换你使用的ShellExecuteEx。 lpStartupInfo参数让标准进入和标准化进程的句柄。 只需使用CreatePipe创建一个匿名管道,将其作为参数传递。 这个MSDN文章有一个如何做到这一点的例子。
您需要为子进程创建一个命名管道。 本MSDN文章解释并有代码示例。
你应该可以从中解脱出来。
你可以不使用CreateProcess / ShellExecuteEx来执行一个命令的stdout / stderr重定向的cmd shell,从而调用你的过程?
“cmd / c YourProcess.exe {参数}”等?