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

Windows Discussion :

CreateProcess (impossible de gérer le symbole >


Sujet :

Windows

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut CreateProcess (impossible de gérer le symbole >
    Bonsoir tout le monde, voila 4h que j'essaye de résoudre un problème qui est le suivant :

    voici la méthode que j'appelle, avant son exécution, this->cmd est de valeur : "rsync -rtv /cygdrive/e/guillaume/ --port=3874 /cygdrive/q/guillaume/ > text.txt" lors de l'appel de la méthode, tout fonctionne bien hormis le fait qu'il ne tiens pas du tout en compte le caractère ">" pour charger le résultat de ma commande dans le fichier "text.txt". Cette commande marche parfaitement en mode commande de windows. J'ai essayé tout ce que je connaissait. le type attendu par CreateProcess est un char*, ce que je lui ai donné de toutes les façons possible. Ca fonctionne bien sous delphi avec la commande :

    CreateProcess(nil,PChar(programmest), nil, nil, False,
    CREATE_DEFAULT_ERROR_MODE + NORMAL_PRIORITY_CLASS, nil, nil, myStartupInfo, myProcessInfo); (programmest étant un String)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    int Commande::Executer(){
        Form1->Label1->Caption = this->cmd;
        DWORD codeSortie;
        int valeurRetour = 0;
        STARTUPINFO infoDemarrage;
        PROCESS_INFORMATION infoProcessus;
        memset(&infoDemarrage, 0, sizeof(TStartupInfo));
        memset(&infoProcessus, 0, sizeof(TProcessInformation));
        infoDemarrage.cb = sizeof(TStartupInfo);
        infoDemarrage.dwFlags = STARTF_USESHOWWINDOW;
        infoDemarrage.lpTitle = this->cmd.c_str();
        if (invisible)
            infoDemarrage.wShowWindow = SW_HIDE;
        else
            infoDemarrage.wShowWindow = SW_SHOWNORMAL;
        if(CreateProcess(NULL, this->cmd.c_str(), NULL, NULL, 0, CREATE_DEFAULT_ERROR_MODE
                         ,NULL, NULL, &infoDemarrage, &infoProcessus)){
            GetExitCodeProcess(&infoProcessus.hProcess, &codeSortie);
            while(WaitForSingleObject(infoProcessus.hProcess, 0)==WAIT_TIMEOUT){
                Application->ProcessMessages();
                GetExitCodeProcess(&infoProcessus.hProcess, &codeSortie);
            }
        }
        else
            valeurRetour = GetLastError();
        CloseHandle(infoProcessus.hProcess);
        CloseHandle(infoProcessus.hThread);
        return valeurRetour;
    }
    Merci d'avance à mon sauveur.

    borgirz.

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    pourquoi tu utilises pas directement ShellExecute au lieu du createprocess qui sert à rien dans ce cas precis.

    L'interet d'un createProcess c'est de recuperer le handle du process. Toi tu le detruis directement apres donc ce que tu veux c'est juste executer une ligne de commande
    il y a du linge sur la corde à linge

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En fait ce qui m'interresse vraiment c'est de pouvoir traiter en temps réel le fichier créé par la commande afin d'afficher sous windows les lignes qui apparaissent sous dos. une commande rsync peux parfois durer des heures et je ne tiens pas à afaire attendre cela aux utilisateurs du programme, il doivent voir ou en est la syncronisation : quels fichiers, combien de % accomplis, ...etc.

    Maintenant si c'est possible avec ShellExecute, pourquoi pas. je vais analyser un peu la structure de cette fonction. En attendant je laisse le topic ouvert. Merci beaucoup pour cette première réponse. Cela dit, ca marche sous delphi, ca doit marcher sous bcb. Sans doute qqchose qui m'échappe.

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    une commande rsync peux parfois durer des heures et je ne tiens pas à afaire attendre cela aux utilisateurs du programme, il doivent voir ou en est la syncronisation : quels fichiers, combien de % accomplis, ...etc.
    t'as qu'a crée un thread pour lancer ton programme
    il y a du linge sur la corde à linge

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 669
    Points
    10 669
    Billets dans le blog
    3
    Par défaut Re: CreateProcess (impossible de gérer le symbole >
    Citation Envoyé par borgirz
    voici la méthode que j'appelle, avant son exécution, this->cmd est de valeur : "rsync -rtv /cygdrive/e/guillaume/ --port=3874 /cygdrive/q/guillaume/ > text.txt" lors de l'appel de la méthode, tout fonctionne bien hormis le fait qu'il ne tiens pas du tout en compte le caractère ">" pour charger le résultat de ma commande dans le fichier "text.txt". Cette commande marche parfaitement en mode commande de windows.
    C'est normal. ">" est une commande de redirection que seul l'interpréteur de commande connait (cmd.exe). 2 solutions :
    - la rapide : tu n'exécute pas rsync mais "cmd.exe" ou" command.com" (en fonction de l'OS) avec en paramètre ce que tu as donné.
    - la puissante : dans CreateProcess, tu fais ce que cmd.exe fait, c'est à dire tu rediriges les flux standard avec ce que tu veux. rsync sera exécuté sans qu'une console n'apparaisse et toi en temps réel tu pourras récupérer tout ce cette commande affiche. Il faut pour cela créer un pipe et au moment du CreateProcess dire d'écrire dans ce pipe au lieu d'écrire sur la sortie standard. C'est un peu complexe, du moins à comprendre car il y a une histoire d'héritage de handle à gérer et une pirouette à faire.
    http://support.microsoft.com/?kbid=190351

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

Discussions similaires

  1. Impossible de gérer une condition
    Par Akim13 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/08/2008, 14h49
  2. DIV Impossible de gérer le height 100%
    Par ChronoTiger dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/11/2007, 15h15
  3. Impossible de gérer les index sous Paradox 5
    Par User dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/03/2007, 21h24
  4. Impossible de gérer les index sous Paradox 5..
    Par User dans le forum Paradox
    Réponses: 1
    Dernier message: 16/03/2007, 16h36
  5. Réponses: 1
    Dernier message: 01/11/2006, 18h03

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