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

C++ Discussion :

CreateProcess, ou comment l'utiliser?


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant a 42 en developement logiciel et R&D
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant a 42 en developement logiciel et R&D

    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut CreateProcess, ou comment l'utiliser?
    Bonjour à tous et à toutes,

    Voila, je me suis mis à développez un petit soft pour m'aider au travail. Rien de bien compliquer, je veux reproduire un winscp en mode léger pour transférer un seul et même ficher sur une 20ene ou plus de bécane via protocole pscp. Le pc d'envoie est un windows, les pc de reception souvent linux mais possible aussi sous windows.

    Voici donc mon problème, j'ai ce code :


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    CheckListBox1->Visible = false;
    stateSend->Visible = true;
     
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
     
    BOOL b = false;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof (STARTUPINFO);
    ZeroMemory(&pi, sizeof (PROCESS_INFORMATION));
    char parametre[200] = "\0";
    char parametre2[10] = "\0";
     
    for(int i = 0; i < CheckListBox1->Count; i++)
    {
            if(CheckListBox1->Selected[i] == false)
            {
                    AnsiString ping = " " + CheckListBox1->Items->Strings[i];
                    strcpy(parametre2, ping.c_str());
                    //On teste avant tout que l'on puisse communiquer avec la machine
                    b = CreateProcess("ping.exe", parametre2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
     
                    if(b)
                    {
                            stateSend->Font->Color = clBlue;
                            stateSend->Text = stateSend->Text + "Ping " + ping + " reussi...\r\n";
     
                            AnsiString texte =  CheckListBox1->Items->Strings[i];
                            texte = texte.Trim();
                            //exemple pscp.exe -l root -pw root 127.0.0.1:C:\\File C:\\File
                            AnsiString param = " -l " + UserCh->Text + " -pw " + MdpCh->Text + " " + texte + ":"+ OpenDialog1->FileName + " " + Sortie->Text;
                            strcpy(parametre, param.c_str());
                            b = CreateProcess("pscp.exe", parametre, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
     
                            if(b)
                            {
                                    stateSend->Font->Color = clBlue;
                                    stateSend->Text = stateSend->Text + "Transfert vers machine " + CheckListBox1->Items[i].Text.Trim() + " reussi...\r\n";
                            }
                            else
                            {
                                    stateSend->Font->Color = clRed;
                                    stateSend->Text = stateSend->Text + "Transfert vers machine " + CheckListBox1->Items[i].Text.Trim() + " code KO...\r\n"  ;
                            }
                    }
                    else
                    {
                            stateSend->Font->Color = clRed;
                            stateSend->Text = stateSend->Text + "Ping " + ping + " Code KO...\r\n";
                    }
           }

    CheckListBox1 est une liste d'adresse ip.
    parametre2 est initialisé à 10, c'était juste pour tester 127.0.0.1 vois si les \0 jouais sur l'efficacité de la trame.

    Je cherche donc à ping la machine distante voir si je peut communiquer avec elle, et si oui, j'envoie le fichier grâce a pscp.exe

    Le problème est que je doit mal utiliser CreateProcess car même le ping me retourne un code d'erreur avec un test tel que "ping 127.0.0.1"

    Je ne cherche pas a savoir si createProcess est bien ou pas, si c'est du code propre, juste que ça fonctionne

    S'auriez vous me dire ce que je fait mal? la doc me le dit pas, et les différents et ultra nombreux sujet du web à ce sujet ont soit été rembarré car c'est "pas du joli code", soit ben ils ont fait comme moi... ou presque

    Deuxièmement: Est-il possible de récupérer avec createProcess la chaîne de retour? Un ping nous retourne ses résultats, comment les récupérer? Rediriger le resultat vers une chaîne de caractère par exemple

    Merci pour votre aide.
    Michael

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Ne serait-il pas plus simple d'utiliser popen ? C'est justement fait pour de type de situation
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant a 42 en developement logiciel et R&D
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant a 42 en developement logiciel et R&D

    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    C'est du linux ça popen, le programme est développé sous windows

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Tu peux coder une commande ping.

    Je ne sais plus comment.

    Ce lien (unix) peut être un bon début :
    http://www.jbox.dk/sanos/source/util...ng.c.html#:326

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant a 42 en developement logiciel et R&D
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant a 42 en developement logiciel et R&D

    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    Pas le temps, j'ai aussi du travail à coté. Et je vois pas l’intérêt de réinventer la roue alors que ma voiture peut aller au garage non? ^^

    Cela dit, j'ai trouvé. Ça me parait être une solution un peu bâtarde, mais si ça marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AnsiString ping = "ping -n 1 " + CheckListBox1->Items->Strings[i];
                    strcpy(parametre2, ping.c_str());
                    //On teste avant tout que l'on puisse communiquer avec la machine
                    b = CreateProcess(NULL, parametre2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    Je passe tout en paramètre. Ça fonctionne pas mal.

    Maintenant, quand j'aurai 2 minutes il faut que je trouve comment rediriger la sortie de la console vers mon programme. Pour ceux qui voudrais apporter leurs pierres, voici ce que j'ai fait entre midi et une heure:


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    HANDLE PipeIn;
    HANDLE PipeOut;
    TSecurityAttributes Securite;
    TStartupInfo StartupInfo;
    TProcessInformation ProcessInfo;
     
    CheckListBox1->Visible = false;
    stateSend->Visible = true;
     
     
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
     
    BOOL b = false;
     
    si.wShowWindow = SW_HIDE;
      si.hStdInput = &PipeIn;
      si.hStdOutput= &PipeOut;
      si.hStdError = &PipeOut;
     
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof (STARTUPINFO);
    ZeroMemory(&pi, sizeof (PROCESS_INFORMATION));
    char result[300] = "\0";
    char parametre[200] = "\0";
    char parametre2[100] = "\0";
    DWORD NbRead;
    String str;
     
    for(int i = 0; i < CheckListBox1->Count; i++)
    {
            if(CheckListBox1->State[i] == true)
            {
            CreatePipe(&PipeIn,&PipeOut,&Securite,0);
                    AnsiString ping = "ping -n 1 " + CheckListBox1->Items->Strings[i];
                    strcpy(parametre2, ping.c_str());
                    //On teste avant tout que l'on puisse communiquer avec la machine
                    b = CreateProcess(NULL, parametre2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
                    WaitForSingleObject(pi.hProcess,INFINITE);
                    CloseHandle(PipeOut);
                    while(ReadFile(&PipeIn, result, 300, &NbRead, NULL))
                    {
                            str = result;
                    }
                    CloseHandle(PipeIn);
     
             CreatePipe(&PipeIn,&PipeOut,&Securite,0);
                    if(b)
                    {
                            stateSend->Font->Color = clBlue;
                            stateSend->Text = stateSend->Text + "Ping " + ping + " reussi...\r\n\r\n";
     
                            AnsiString texte =  CheckListBox1->Items->Strings[i];
                            texte = texte.Trim();
                            //exemple pscp.exe -l root -pw root 127.0.0.1:C:\\File C:\\File
                            AnsiString param = "pscp.exe -l " + UserCh->Text + " -pw " + MdpCh->Text + " " + texte + ":"+ OpenDialog1->FileName + " " + Sortie->Text;
                            strcpy(parametre, param.c_str());
                            b = CreateProcess(NULL, parametre, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
                            WaitForSingleObject(pi.hProcess,INFINITE);
                            CloseHandle(PipeOut);
                            while(ReadFile(&PipeIn, result, 300, &NbRead, NULL))
                            {
                                    str = result;
                            }
                            CloseHandle(PipeIn);
                            if(b)
                            {
                                    stateSend->Font->Color = clBlue;
                                    stateSend->Text = stateSend->Text + "Transfert vers machine " + CheckListBox1->Items[i].Text.Trim() + " reussi...\r\n\r\n";
                            }
                            else
                            {
                                    stateSend->Font->Color = clRed;
                                    stateSend->Text = stateSend->Text + "Transfert vers machine " + CheckListBox1->Items[i].Text.Trim() + " code KO...\r\n\r\n"  ;
                            }
                    }
                    else
                    {
                            stateSend->Font->Color = clRed;
                            stateSend->Text = stateSend->Text + "Ping " + ping + " Code KO...\r\n\r\n";
                    }
           }
    J'ai utilisé la méthode du pipe pour le rediriger, mais il doit me manquer quelques choses, pas encore trouvé quoi. Je reçois pas les informations... Pour le moment pas le temps, je regarderai ça en fin d'aprem.

    Merci pour vos réponses en tout cas

    Ça n'existe pas la commande spoiler sur ce forum????

    Michael

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Les spoilers, c'est plus en rapport avec l'art qu'avec la technique. Je ne vois pas ce qu'on pourrais qualifier de spoiler ici...

    Pour la redirection de sortie

    En mode console uniquement:
    http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx (ok, c'est pas une redirection, mais c'est beaucoup plus simple, donc ce n'est pas plus mal ).

    En mode GUI ou en mode console:
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre averti
    Homme Profil pro
    Etudiant a 42 en developement logiciel et R&D
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant a 42 en developement logiciel et R&D

    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    Niquel, tout mes remerciements !

    Je regarde des que j'ai 2 minutes pour l'adapter a mon prog, mais ça semble correspondre parfaitement.

  8. #8
    Membre averti
    Homme Profil pro
    Etudiant a 42 en developement logiciel et R&D
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant a 42 en developement logiciel et R&D

    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    Effectivement problème résolu. C'est vrai que j'ai été un peu niais de pas penser passer par une redirection vers un buffer puis lecture de celui-ci pour l'intégré dans la GUI.

    Seul petit bémole que je n'ai pas vraiment résolut, c'est la qualité du texte, vu que les accents ne passe pas bien dans un char* ^^. Mais bon pas vraiment un problème.


    D'ailleurs si quelqu'un passe par là (pas en 2014 hein), vous savez comment on peut faire pour rechercher un mot dans une expression ansistring?
    Exemple: "Mémoire désallouée correctement" et je veux pouvoir récupérer ses trois mots séparément dans différents string !

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Arameya Voir le message
    Effectivement problème résolu. C'est vrai que j'ai été un peu niais de pas penser passer par une redirection vers un buffer puis lecture de celui-ci pour l'intégré dans la GUI.

    Seul petit bémole que je n'ai pas vraiment résolut, c'est la qualité du texte, vu que les accents ne passe pas bien dans un char* ^^. Mais bon pas vraiment un problème.


    D'ailleurs si quelqu'un passe par là (pas en 2014 hein), vous savez comment on peut faire pour rechercher un mot dans une expression ansistring?
    Exemple: "Mémoire désallouée correctement" et je veux pouvoir récupérer ses trois mots séparément dans différents string !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::stringstream stream(str);
    while (str) {
      std::string word;
      str >> word;
      std::cout << "nouveau mot: " << word << std::endl;
    }
    ?

    Je lance ça au hasard, j'ai la flemme de tester
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/02/2005, 14h39
  2. [Optimisation] Comment bien utiliser le StringBuffer?
    Par mathieu dans le forum Langage
    Réponses: 4
    Dernier message: 17/05/2004, 14h22
  3. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 16h37
  4. [scrapbook] comment l'utiliser ?
    Par Didier 69 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 16/04/2004, 17h28
  5. [INDY] -> IdIdentServer comment l'utiliser ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/08/2003, 16h00

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