J'ai une application de console que je suis lancé à partir d'une interface graphique. La demande de console prend des paramètres pour les noms de fichiers pour analyser et traiter. Actuellement, je suis capable de capturer sa sortie et d'l'afficher dans l'application GUI, mais j'aimerais pouvoir envoyer des commandes afin de contrôler ou même d'arrêter son exécution.
Comment puis-je envoyer une commande ou une chaîne ou quelque chose à l'application de la console, de préférence à l'aide des tuyaux que j'ai ouverts afin de lire sa sortie? p> puis sur le côté de la console, il y a un fil en attente de l'entrée. Voici la méthode d'exécution: P> while not Terminated do
begin
ReadLn(Command);
// process command
Sleep(10);
end;
3 Réponses :
Avec le pipeline de sortie, il y a un pipeline d'entrée. Écrivez simplement à ce tuyau à l'aide de Wrystfile (). P>
Ouais je soupçonne que, mais dans la console, était-ce que c'était ramassé? Je suppose que c'est une lecture réadlni, j'ai besoin de vérifier cela dans un thread, mais l'entrée est identique à celle de l'application de la console. Il ne reçoit pas les commandes de l'application GUI, presque comme si elle se lit. Peut-être que je fais quelque chose de mal.
En fonction de la façon dont vous écrivez au processus, vous pourriez avoir à rincer. Si vous utilisez une API Wrôlerfile (), vous n'avez pas besoin. La poignée STDIN du processus est dans l'enregistrement STARTUPINFO, dans le champ HSTDINPUT. Si l'application de la console ne lit pas son entrée, vous ne pouvez rien faire à ce sujet.
Actuellement, il a un fil qui exécute une commande READLN mais l'info est un miroir ou ce qu'il génère dans son Writeln. Alors je me demandais pourquoi cela est-ce.
Euh, un commentaire évident capitaine: l'entrée et la sortie sont deux poignées différentes des deux côtés. Vous lisez-en un, écrivez à l'autre (il y a aussi Sterrr, mais c'est une autre histoire). L'écriture sur le processus de sortie du processus de console n'arrivera pas au processus de la console comme entrée.
Voir ma réponse à Fupsduk parce que je pense que vous ne comprenez pas mon problème. Je sais que les poignées sont différentes, mais les données qui vont à la console ne sont pas les données que j'ai envoyées à l'aide de Writefile avec la poignée à l'écriture de l'écriture fournie par StarTupinfo.
Vérifiez cela pour voir que vous devez créer les deux tuyaux (en appelant le Winapi deux fois) comme réitéré par NAT, mais qu'en est-il des poignées héritables - je ne sais pas pourquoi cela est nécessaire? P>
http://support.microsoft.com/kb/190351 . P >
Je pense que ce qui pourrait également être déroutant, c'est que lorsque vous créez un tuyau, vous créez une poignée de lecture et une poignée d'écriture pour ce tuyau. Dans le cas du tuyau STDIN de la console, vous n'utiliserez que la poignée d'écriture. Ensuite, vous créez un autre tuyau pour le stdout de la console (qui aura également une poignée de lecture et d'écriture), mais vous n'utiliserez que la poignée de lecture. P>
Je crois que j'ai cela correct mais il est tard et je vais me coucher. P>
J'ai le code source de l'application de console. Dans l'application GUI, je suis capable de lire la sortie de l'application de la console à l'aide des éléments suivants - Readfile (Readpipe, PBuffer [0], Tampersize, BYTESPEAD, NIL). Cela fonctionne comme réadappe est fourni par le StarTupinfo transmis à CreateProcess. Maintenant, je suppose que les données de déplacement de la manière dont j'utilise l'enregistreur avec WritePipe fournie par le même StarTupinfo. Maintenant, lorsque je le fais, les informations que j'envoies sont fournies à l'application de la console comme exactement ce qui était dans le réadappe et non ce que je veux envoyer. J'espère que cela éclaircit ce que j'essaie de dire.
Vous avez besoin de deux tuyaux, un pour le processus d'envoi de la sortie ( à partir de votre code, on dirait que vous mettez les deux extrémités du même tuyau em> même em> dans l'enregistrement code> tstartupinfo code>. Donc, vous faites efficacement le processus de parler. : -) p>
Donc, vous devez appeler Ensuite, placez la poignée de lecture de Pour envoyer des données au processus, écrivez dans la poignée d'écriture du tuyau code> stdin code>. Pour lire la sortie du processus, lisez la poignée de lecture du tuyau code> stdout code>. P>
Tant que toutes les poignées de duplication et des trucs inhéritables et non intrientaires décrits sur Cette page ( Spécifiquement dans l'exemple de code), vous besoin em> pour vous assurer que les poignées que vous envoyez au processus sont héritables (comme vous l'avez fait). p>
Vous devriez em> Assurez-vous également que les poignées des tuyaux utilisées par le processus parent sont pas héritables em>. Mais vous ne em> avez-vous em> pour faire cela ... Je me suis écarté de ne pas le faire avant. P>
Vous pouvez le faire en appelant Cela fait longtemps que je l'ai fait moi-même, mais je suis à peu près sûr que cela est donc pour que le nombre de références pour les poignées soit associé au processus d'appel, plutôt que le processus d'enfant. Cela empêche une poignée étant fermée pendant que vous l'utilisez toujours (le processus d'appel pourrait fermer «stdin» par exemple). Assurez-vous de fermer les poignées cependant, sinon vous finirez de fuir les poignées. P>
hth. p>
n @ p> stdout code>), et un pour vous envoyer une entrée au processus (
stdin code>). p>
Createaispe () code> deux fois, pour créer deux tuyaux, un pour
stdin code>, un pour
stdout code> (et < Code> starr code>). p>
stdin code> dans
SUISTARTUTUP.HSTDINPUT code> et la poignée d'écriture de
stdout code> dans
SUISTARTUP.HSTDOUTPUT < / code> p>
duplicatedle () code> sur les poignées, spécifiant qu'ils ne sont pas héritables et ferment les anciennes poignées, ou appelant
SethandleInformation () code> avec 0 spécifié Pour les drapeaux (comme discuté ici ). p>
+1 Pour plus de clarté et de brièveté, mais que faites-vous des poignées héritables décrites ici support.microsoft.com/kb / 190351 .
Merci de répondre. Basé sur votre allusion à la création du tuyau deux fois, je suis venu sur un article qui répond parfaitement à mes besoins. J'ai inclus un lien avec ça.
Vous avez donc le code source pour les deux applications? Sont-ils tous deux écrit à Delphes?
J'ai ajouté le code source.
+1 Pour afficher le code source - fait toute la différence pour essayer d'aider.
Merci. Aurait dû le faire de la part d'aller.