IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Récupération de la sortie d'un prog et interactivité


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Récupération de la sortie d'un prog et interactivité
    Bonsoir,

    j'ai quelques questions, pour un programme j'ai besoin de lancer d'autres programmes et récupérer leur output, jusque là ça marche super en utilisant CreateProcess, et WaitForSingleObject, seulement là où ça ne fonctionne plus c'est quand je lance un programme win32 par exemple, bon là si j'ai passé INFINITE comme paramètre à WaitForSingleObject, ça mouline dans le vent jusqu'à planter l'application.

    Le problème c'est biensur que l'application win32 avec interface etc n'écris rien via WriteLn() etc.

    Bon c'est là que j'explique correctement le problème (il est temps), admettons maintenant ce programme console du C pour changer (je sais je ne suis pas dans le forum consacré au C)
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    int main( void )
    {
      int x;
     
     printf("Entrez un chiffre ...: \t");
     scanf(&x, "%d");
     
      printf("\nResultat : %d", x);
     
     return 0;
    }
    le problème est biensur en Delphi et pas dans ce code C, je récupère ceci (en admettant que j'ai posé un Memo et que j'y ajoute le resultat que je lis grâce à CreateProcess etc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Entrez un chiffre ...:     
    Resultat : 2
    Le problème c'est que je n'ai pas rentré le 2, on dirait qu'il le pré-remplie tout seul, et si dans un programme console Pascal je viens à lancer un MessageDlg (oui oui je sais c'est moitié console ) alors là comme dis plus haut ça tourne dans le vent et cette boite ne s'affiche pas du coup je ne peux pas cliquer oui/non/abort/...

    Bref comment faire dans le cas preci du programme C plus haut pour lire le resultat jusqu'à la demande d'input, là redonner la main à mon programme pour que je puisse lui envoyer (au programme console), et ensuite lire le resultat, et ça autant de fois qu'il serait demandé d'entrer quelquechose.
    En gros émuler l'invite de commande DOS ?

    je ne sais pas si j'ai était super clair, pourtant c'est simple à expliquer

    j'ajoute que j'ai bien evidemment cherché , j'ai trouvé deux ou trois réponses interessantes mais qui donnent le même resultat je ne peux pas envoyer des infos au programme etc comme dit plus haut.

    Aussi : je tourne sous Delphi6 Perso.

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Pour une application Win32 pure ( et non console ) n'utilisant las les fichiers standard StdInput StdOutput et StdError tu sera obligé de gérer un echangé entre les deux applications.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Ouais ça je m'en doutais un peu, mais c'est pas très grave puisqu'avec un timeout à la place de infinite pour WaitForSingleObject ça m'eviteras de planter le prog qui appel l'autre.

    Mais au niveau d'un programme console demandant d'entrer des infos tu as une idée/piste ?

    en gros pour résumer c'est comme si on lançait l'invite de commandes de windows, là on tape truc.exe, ça affiche ce qu'il faut jusqu'à la demande de saisie, là on rentre ce qui est demandé et ça poursuit, c'est ça que je voudrais reproduire mais pour l'instant sans succès.

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je me souviens avoir vu la trace d'un composant gratuit que le faisait ( détournement de l'entrée standard et de la sortie standard ). On en a marlé dans ce forum mais je ne me souvient plus quand.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    J'ai cherché sur le forum j'ai trouvé quelquechose (pas un composant) je ne sais pas si ça va me convenir ou pas, il faut que je regarde de plus près le code.

    Voici le lien : http://www.felix-colibri.com/papers/colibri_helpers/stdin_stdout/stdin_stdout.html

    Dans cet exemple il envoie lui même au programme le résultat, donc je vais regarder ça, même si je n'aime pas trop la façon dont il organise son code avec de nombreux dossiers, enfin c'est qu'un détail.

    Le but est biensur d'émuler un shell sous windows, mon programme est fonctionnel et gère pas mal de choses ainsi que des commandes Unix (pas toutes évidemment), les pipes, redirections etc, mais ne permet pas l'interactivité à cause du problème énoncé plus haut, peut-être que la solution est là.

    Je te tiendrais au courant, merci de ton aide (et merci pour ton astuce sur ton site, pour changer le caret dans un TEdit, qui fonctionne biensur également pour un TRichEdit).

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bon le truc du dessus ne fait pas ce que je voulais, mais j'ai trouvé un composant qui fait ça, à condition de bien flusher stdout à chaque fois dans le programme qu'on execute, et on récupere ça ligne par ligne.

    Je vais voir comment on s'en sert bien, et ensuite j'aurai qu'a modifier mon prog pour utiliser ça en transparence, y'a du boulot.

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/09/2010, 12h52
  2. Réponses: 3
    Dernier message: 27/03/2007, 14h39
  3. Réponses: 9
    Dernier message: 21/06/2006, 16h41
  4. Récupération des paramètres en sortie d'1 procédure stockée
    Par navis84 dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/12/2004, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo