Liest einen anderen Prozess 'stdout in C ++

8

Gibt es in Windows eine Möglichkeit, einen Prozess in C ++ zu starten und dann zu lesen, was es in stdout ausgespuckt hat, wenn es fertig ist? Der Prozess muss bei Bedarf mit erhöhten Rechten (unter Vista oder höher) ausgeführt werden.

Ich benutze derzeit ShellExecuteEx (), um den Prozess zu starten und eine while-Schleife auszuführen, bis GetExitCodeProcess () STILL_ACTIVE nicht mehr über den lpExitCode-Parameter zurückgibt (mit einem WaitForSingleObject () -Aufruf, der während jeder Iteration 100 ms wartet).

    
RobH 04.11.2010, 01:53
quelle

4 Antworten

3

Es gibt keinen einfachen Weg, dies zu tun.

Aufruf von ShellExecuteEx() mit dem runas Verb sendet eine RPC-Nachricht an den AppInfo NT-Dienst , der dann die Anwendung von einer erhöhten Sitzung aus ausführt. Es gibt keine API, um die Eingabe / Ausgabe des erhöhten Prozesses einfach mit Ihrer Anwendung zu verbinden.

Thomas Hruska in seinem Der Code Project-Artikel präsentiert seine Implementierung einer CreateProcessElevated() -Funktion das löst das.

Anstatt das erweiterte Programm direkt auszuführen, verwendet CreateProcessElevated() eine andere ausführbare Datei, die den Namen der stdin, stdout, stderr benannten Pipes erhält und ihre Handles in der erhöhten Sitzung vor dem Aufruf von CreateProcess() erneut erstellt. .

    
Alexandre Jasmin 04.11.2010, 03:51
quelle
1

Sie sollten Ihre Verwendung von ShellExecuteEx durch CreateProcess ersetzen. Das lpStartupInfo -Argument lässt das Std-In- und das Std-Out-Handle von der Prozess. Erstellen Sie einfach eine anonyme Pipe mithilfe von CreatePipe , die Sie als Argumente übergeben. Dieser MSDN-Artikel enthält ein Beispiel dafür, wie Sie dies tun können.

    
zdan 04.11.2010 02:14
quelle
0

Sie müssen eine benannte Pipe für den untergeordneten Prozess erstellen. Dieser MSDN-Artikel wird erläutert und enthält Codebeispiele.

Sie sollten in der Lage sein, daraus zu kommen.

    
Byron Whitlock 04.11.2010 02:08
quelle
0

Können Sie CreateProcess / ShellExecuteEx nicht verwenden, um eine Cmd Shell mit stdout / stderr umzulenken, die wiederum Ihren Prozess aufruft?

"cmd / c YourProcess.exe {Parameter}" usw.?

    
JimR 04.11.2010 04:14
quelle

Tags und Links