8
votes

Lire un autre processus 'stdout en C ++

sous Windows, est-il un moyen de lancer un processus en C ++, puis de lire ce qu'il est cédé dans stdout quand c'est fait? Le processus doit être exécuté à l'aide de privilèges élevés (sur Vista ou ultérieur) si nécessaire.

J'utilise actuellement ShellexecuteEex () pour lancer le processus et exécuter une boucle tandis que GetExitCodeProcess () ne renvoie plus still_active via le paramètre LPExitCode (avec un appel de servieforSingleObject () faire une attente de 100 ms à chaque itération).


2 commentaires

Pouvez-vous rediriger le stdout dans un tuyau nommé lors du lancement du processus? (Pas un développeur C ++, ce qui en fait un commentaire)


Le problème est que pour exécuter un processus élevé que vous devez utiliser shellexecuteex () avec le verbe runas verbe. Et shellexecuteex () ne prend pas en charge la redirection de sortie Afaict.


4 Réponses :


0
votes

Vous devez créer un tuyau nommé pour le processus d'enfant. Cet article MSDN explique avec et dispose d'échantillons de code .

Vous devriez être capable de l'obtenir de cela.


1 commentaires

Malheureusement, cette solution utilise CreateProcess () plutôt que shellexecuteex ().



3
votes

Vous devez remplacer votre utilisation de ShellexecuteEx avec CreateProcess < / a>. L'argument LPSTARTUPINFO laisse le std in et les poignées du processus. Créez simplement un tuyau anonyme à l'aide de CreateEpipe que vous passer comme les arguments. Ce Article MSDN a un exemple de comment Faites cela.


1 commentaires

Mais CreateProcess () ne peut pas être utilisé pour démarrer un processus surélevé, à moins que le processus parent soit également élevé.



3
votes

Il n'y a pas de moyen facile de le faire.

appeler shellexecuteeex () avec le verbe verbe envoie un message RPC au service appinfo nt service sorcière puis exécutez l'application à partir d'une session surélevée. . Aucun API ne connaît pas facilement l'entrée / sortie du processus élevé à votre application.

thomas hruska dans son L'article du projet de code présente sa mise en œuvre de A CreateProcesselevated () fonction qui résout ceci.

au lieu d'exécuter le programme surélevé directement CreateProcesselevated () s'appuie sur un autre exécutable qui reçoit le nom du stdin, stdout, stderr Named Tipes et recréez leurs poignées dans le Séance surélevée avant d'appeler CreateProcess () .


1 commentaires

J'aime la solution de projet de code. Malheureusement, comme cela implique une DLL distincte, je ne pourrai pas l'utiliser pour mon projet particulier, qui est une application Bootstrap d'un installateur. (Soupir! Retour à la planche à dessin, je suppose.)



0
votes

Pouvez-vous ne pas utiliser CreateProcess / ShellexecuteEx pour exécuter une coquille CMD avec STDOUT / STDERR redirigé à son tour, invoque votre processus?

"cmd / c uprocess.exe {paramètres}" etc?


0 commentaires