Lesen, ein anderer Prozess' stdout in C++
In Windows, gibt es eine Möglichkeit, einen Prozess einzuleiten, in C++ und dann Lesen, was es ausgespuckt in stdout aus, wenn es fertig ist? Der Prozess muss ausgeführt werden, mit erhöhten rechten (unter Vista oder höher), wenn nötig.
Ich bin derzeit mit ShellExecuteEx (), um den Vorgang zu starten und läuft eine while-Schleife, bis GetExitCodeProcess() gibt nicht länger STILL_ACTIVE über die lpExitCode parameter (mit WaitForSingleObject () - Aufruf tut einem 100 msec warten, während jeder iteration).
- Können Sie umleiten von stdout in eine named pipe, die beim Start des Prozesses? (Kein C++ Entwickler, damit diese ein Kommentar)
- Das problem ist, dass zum ausführen einer erhöhten Prozess, den Sie verwenden müssen
ShellExecuteEx()
mit derrunas
verb. UndShellExecuteEx()
unterstützt keine Ausgabe-Umleitung AFAICT.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine einfache Möglichkeit, dies zu tun.
Aufrufen
ShellExecuteEx()
mit derrunas
verb sendet eine RPC-Nachricht an den AppInfo NT Service Hexe dann führen Sie die Anwendung aus einer erhöhten Sitzung. Es gibt keine API, um einfach verbinden Sie den Eingang/Ausgang des erhöhten Prozess für Ihre Anwendung.Thomas Hruska in seiner Die Code Project Artikel präsentiert seine Umsetzung der
CreateProcessElevated()
Funktion, löst dieses.Stattdessen laufen die erhöhten Programm direkt
CreateProcessElevated()
beruht auf einer anderen ausführbaren Datei, auf die der name des stdin,stdout,stderr named pipes und erstellen Sie Ihre Griffe in den erhöhten session vor dem AufrufCreateProcess()
.Sollten Sie ersetzen Ihre Nutzung von ShellExecuteEx mit CreateProcess. Die lpStartupInfo argument können die std und std-out handles des Prozesses. Nur eine anonyme pipe Erstellen, mit CreatePipe, dass Sie gehen, wie die Argumente. Diese MSDN-Artikel ist ein Beispiel, wie dies zu tun.
Erstellen Sie eine named pipe an den Kind-Prozess. In diesem MSDN-Artikel erklärt und mit code-samples.
Sollten Sie in der Lage sein, um es Los zu.
Können Sie nicht verwenden CreateProcess/ShellExecuteEx zu exec cmd-shell mit stdout/stderr umgeleitet werden, die wiederum ruft Ihren Prozess?
"cmd /c YourProcess.exe {Parameter}" etc?