2010-11-04 12 views
8

En Windows, ¿hay alguna manera de iniciar un proceso en C++ y luego leer lo que escupió en stdout cuando lo haya hecho? El proceso debe ejecutarse utilizando privilegios elevados (en Vista o posterior) si es necesario.Lea otro proceso 'stdout en C++

Actualmente, estoy utilizando ShellExecuteEx() para iniciar el proceso y ejecutar un while-loop hasta que GetExitCodeProcess() ya no devuelve STILL_ACTIVE mediante el parámetro lpExitCode (con una llamada WaitForSingleObject() haciendo una espera de 100 mseg durante cada iteración) .

+0

¿Se puede redirigir stdout a un conducto con nombre al iniciar el proceso? (No es un desarrollador de C++, lo que hace que este sea un comentario) –

+3

El problema es que para ejecutar un proceso elevado tienes que usar 'ShellExecuteEx()' con el verbo 'runas'. Y 'ShellExecuteEx()' no admite la redirección de salida AFAICT. –

Respuesta

3

No hay una manera fácil de hacerlo.

Calling ShellExecuteEx() con el verbo runas envía un mensaje RPC al bruja AppInfo servicio de NT a continuación, ejecutar la aplicación desde una sesión elevada. No hay API para conectar fácilmente la entrada/salida del proceso elevado a su aplicación.

Thomas Hruska en su The Code Project article presenta su implementación de una función CreateProcessElevated() que resuelve esto.

En lugar de ejecutar el programa directamente elevada CreateProcessElevated() se basa en otro ejecutable que reciben el nombre de los stdin, stdout stderr canalizaciones con nombre y volver a crear sus asas en la elevación de la sesión antes de llamar a CreateProcess().

+0

Me gusta la solución Code Project. Desafortunadamente, dado que involucra una DLL separada, no podré usarla para mi proyecto en particular, que es la aplicación de arranque de un instalador. (¡Suspiro! Volver al tablero de dibujo, supongo) – RobH

0

Debe crear un conducto con nombre para el proceso secundario. This MSDN article explica con y tiene muestras de código.

Deberías ser capaz de conseguirlo desde allí.

+0

Desafortunadamente, esta solución usa CreateProcess() en lugar de ShellExecuteEx(). –

1

Debe reemplazar su uso de ShellExecuteEx con CreateProcess. El argumento lpStartupInfo permite el acceso estándar y los identificadores del proceso. Simplemente cree un conducto anónimo usando CreatePipe que pase como argumentos. Este MSDN article tiene un ejemplo de cómo hacer esto.

+0

Pero CreateProcess() no se puede usar para iniciar un proceso elevado, a menos que el proceso principal también sea elevado. –

0

¿No puede usar CreateProcess/ShellExecuteEx para ejecutar un shell cmd con stdout/stderr redirigido que a su vez invoca su proceso?

"cmd/c YourProcess.exe {parameters}" etc.?

Cuestiones relacionadas