2010-11-04 11 views
8

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

Ich bin derzeit ShellExecuteEx() unter Verwendung des Verfahrens und den Betrieb eines while-Schleife zu starten, bis GetExitCodeProcess() nicht mehr STILL_ACTIVE über den lpExitCode Parameter gibt (mit einem WaitForSingleObject() eine 100 ms während jeder Iteration warten zu tun) .

+0

Können Sie Stdout in eine Named Pipe umleiten, wenn Sie den Prozess starten? (Kein C++ - Entwickler, daher ist dies ein Kommentar) –

+3

Das Problem ist, dass Sie 'ShellExecuteEx()' mit dem 'runas'-Verb verwenden müssen, um einen erhöhten Prozess auszuführen. Und 'ShellExecuteEx()' unterstützt keine Ausgabeumleitung AFAICT. –

Antwort

3

Es gibt keine einfache Möglichkeit, dies zu tun.

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

Thomas Hruska in seiner The Code Project article präsentiert seine Implementierung einer CreateProcessElevated() Funktion, die dies löst.

Anstatt das erhöhte Programm läuft direkt verlässt sich CreateProcessElevated() auf eine andere ausführbare Datei, die den Namen der stdin, stdout, stderr Named Pipes erhalten und ihre Griffe in der erhöhten Sitzung neu erstellen, bevor CreateProcess() aufrufen.

+0

Ich mag die Code Project-Lösung. Da es sich um eine separate DLL handelt, kann ich sie leider nicht für mein spezielles Projekt verwenden, bei dem es sich um die Bootstrap-Anwendung eines Installationsprogramms handelt. (Seufz! Zurück zum Zeichenbrett, denke ich.) – RobH

0

Sie müssen eine benannte Pipe für den untergeordneten Prozess erstellen. This MSDN article erklärt mit und hat Codebeispiele.

Sie sollten in der Lage sein, es von dort aus zu gehen.

+0

Leider verwendet diese Lösung CreateProcess() lieber als ShellExecuteEx(). –

1

Sie sollten Ihre Verwendung von ShellExecuteEx durch CreateProcess ersetzen. Mit dem Argument lpStartupInfo können die Handles des Prozesses eingegeben und ausgeklammert werden. Erstellen Sie einfach eine anonyme Pipe mit CreatePipe, die Sie als Argumente übergeben. Diese MSDN article hat ein Beispiel dafür, wie dies zu tun ist.

+0

CreateProcess() kann jedoch nicht zum Starten eines erhöhten Prozesses verwendet werden, es sei denn, der übergeordnete Prozess ist ebenfalls erhöht. –

0

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

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

Verwandte Themen