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++Builder Discussion :

cmd et redirections rapides


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut cmd et redirections rapides
    Bonjour.
    J'ai un problème concernant l'utilisation de cmd.exe dans un ShellExecute.
    .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AnsiString A = "/c dir > c:\\se4.txt ";
    ShellExecute( Application->Handle,
                  "open",
                  "c:\\WINNT\\SYSTEM32\\cmd.exe",
                  A.c_str(),
                  "c:\\",
                  SW_SHOW);
    Memo1->Lines->LoadFromFile("c:\\se4.txt");
    DeleteFile("c:\\se4.txt");
    La première exécution est correcte. Mais la seconde produit une erreur :
    "Impossible d'ouvrir le fichier c:\se4.txt".
    Comme si la seconde exécution n'avait pas le temps de créer le second fichier de résultat. Si on attend un temps assez long et par exemple en préparant une autre commande dans la variable A, on finit par avoir le fichier de réponse du ShellExecute précédent.
    J'ai donc tenté de détecter l'arrivée du fichier de résultat après le ShellExecute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // attendre que le fichier existe
    do {
    } while (!(FileExists("c:\\se4.txt")));
    Mais, je me suis rendu compte que la suite plantait pareil parce que cmd crée d'abord un fichier de taille nulle qui existe et est détecté par FileExists() !...
    J'ai donc complété par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Attendre que le fichier soit "plein"
    do {
    handle = open("c:\\se4.txt", O_TEXT);
    } while (filelength(handle) == 0);
    .
    Le plantage se produit identiquement.
    Qui aurait une idée ?
    Y a t'il un problème avec le flag '/c' dans l'argument après cmd ?

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut va voir le post suivant je suis sûr que sa va t'aider: http://www.developpez.net/forums/sho...d.php?t=413196

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Par défaut
    Et en plus j'avais lu ce fil

    J'ai tenté à l'aide de la dernière proposition de dvsoft :
    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
    AnsiString A = "cmd /c ping -a ";
    A = A + Edit1->Text.c_str();
    A = A + " > c:\\se4.txt";
     
    STARTUPINFO         si;
    PROCESS_INFORMATION pi;
     
    ZeroMemory(&si,sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi,sizeof(pi));
    if (!CreateProcess( NULL,
                         A.c_str(),
                         NULL,
                         NULL,
                         false,
                         0,
                         NULL,
                         NULL,
                         &si,
                         &pi)
                       )
            {
            ShowMessage("Erreur : " + IntToStr(GetLastError()));
            }
    else {
            WaitForSingleObject(pi.hProcess, INFINITE);
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
     
            Memo1->Lines->LoadFromFile("c:\\se4.txt");
            DeleteFile("c:\\se4.txt");
            }
    qui marche très bien dans mon application Merci Crayon

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

Discussions similaires

  1. Calcul rapide de percentiles
    Par benj63 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/12/2006, 14h50
  2. LES TECHNIQUES DES SGBDR / MySQL rapide ???
    Par SQLpro dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/09/2003, 11h16
  3. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56
  4. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

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