在Windows中,有没有办法在C ++中启动进程,然后在完成后读取它在stdout中吐出的内容?必要时,必须使用提升的权限(在Vista或更高版本上)运行该过程。
我正在使用ShellExecuteEx()来启动进程并运行while循环,直到GetExitCodeProcess()不再通过lpExitCode参数返回STILL_ACTIVE(在每次迭代期间,WaitForSingleObject()调用执行100毫秒的等待)。
答案 0 :(得分:3)
没有简单的方法可以做到这一点。
使用ShellExecuteEx()
谓词调用runas
会向 AppInfo NT服务发送一条RPC消息,然后从提升的会话中运行该应用程序。没有API可以轻松地将提升过程的输入/输出连接到您的应用程序。
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}”等?