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

MFC Discussion :

[Win32] Redicrection de la sortie standard vers un handle


Sujet :

MFC

  1. #1
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut [Win32] Redicrection de la sortie standard vers un handle
    Bonjour à tous

    Je souhaite recuperer la sortie d'un programme (pscp.exe) que j'ai lancé depuis mon application en utilisant l'api Createprocess.
    L'application est en visual basic mais je poste sur ce forum car la question concerne uniquement l'api win32.
    Quelqu'un sait il comment s'y prendre ? J'ai essayé d'utiliser le handle hStdOutput de la structure STARTUPINFO de mon process. Mais il vaut tout le temps -1.
    Comment associé à ce handle la sortie standard ?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    ta essaye de faire un
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); ?


  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Si je l'ai fait. En fait j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    STARTUPINFO start;
    PROCESS_INFORMATION proc;
    ....
    start.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    start.dwFlags = STARTF_USESTDHANDLES;
    CreateProcess(0, sCommand, 0, 0, 1, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, 0, 0, &start, &proc);
    // Le process se lance et se termine bien.
    // Maintenant je souhaite lire sa sortie en utlilsant start.hStdOutput
    ReadFile(start.hStdOutput, buffer, 1024, bytesreaded, 0);
     
    //J'ai toujours l'erreur handle invalide après cet appel

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    il y a de grandes chances que le thread à la sortie ferme le handle:
    voir doc MDSN :Multithreading: Terminating Threads
    donc essaye de faire un DuplicateHandle du handle avant.

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C'est effectivement possible.
    J'essaierai ça demain. Juste une autre question, lorsqu'un handle est fermé (par closehandle) sa valeur passe t elle à -1 ?

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Bon c'est bon j'ai trouvé .... hier à 1h du matin.
    Pour redirigé la sortie d'un processus fils crée avec CreateProcess vers un fichier, il suffit de

    1 - Creer le handle pour le fichier avec CreateFile, en spécifiant que le handle
    pourra être hérité par des process fils dans le paramètre SECURITY_ATTRIBUTES (bInherit à 1)
    2 - Renseigner les membres hStdOutput et hStdError avec la valeur du handle créées (je sais jamais l'orthographe de ce ..... mot) au 1
    3 - Renseigner le membre dwFlags de STARTUPINFO avec STARTF_USESTDHANDLES
    4 - Creer le processus avec CreateProcess
    5 - Attendre la fin du process
    6 - Lire la sortie du process avec Readfile en utilisant le handle du 1.
    7 - Fermer les handles

    J'aurais souaité transmettre au processus fils directement le handle de la sortie standard (qui est crée lors de l'appel à AllocConsole normalement) du processus appelant , mais bon j'y suis pas arrivé. Je met résolu mais si quelqu'un a une idée sur cette remarque, elle sera a bienvenue

    Bonnes fêtes à tous

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

Discussions similaires

  1. Redirection sortie standard vers widget text
    Par issoram dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 23/01/2009, 17h57
  2. Dévier la sortie standard vers un fichier
    Par Amnesiak dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2008, 08h32
  3. Rediriger une sortie standard vers le presse-papier du bureau
    Par Schmorgluck dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 13/04/2007, 23h15
  4. renvoyer la sortie standard vers un fichier
    Par batotoba dans le forum ANT
    Réponses: 1
    Dernier message: 05/09/2006, 10h06
  5. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07

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