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 :

Détecter la validité d'un handle


Sujet :

C++Builder

  1. #1
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut Détecter la validité d'un handle
    Bonjour à tous

    Je voudrais savoir s'il existe un moyen de détecter la validité d'un handle ? J'emploie une fonction ReadFile() qui lit sur un pipe pour capturer la sortie d'un programme console... mais si le programme n'écrit rien, la fonction crashe en boucle infinie me semble-t-il, j'en ai déduit que c'était parce que le handle n'était plus valide (déjà fermé ? ). Alors que si l'application écrit, ça marche. Y a-t-il un moyen de détecter qu'un handle est toujours valide ?...

    Merci à tous pour vos suggestions

  2. #2
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Bon ben j'ai trouvé moi-même
    Pour résoudre mon problème j'ai tout simplement écrit un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (GetFileSize(hPipe, NULL) > 0) {
      // ... lire les data sur le pipe
    }
    Et à ce moment-là ça marche nickel, sans plantage !
    Si le programme n'a rien écrit, getfilesize renvoit 0 et on s'arrête là, sinon, la taille est positive et on peut lire sans danger
    Pour ceux que ça intéressent, j'ai donc une routine complète qui lance un programme et récupère sa sortie standard (stdout). Grâce au forum, je tiens à préciser J'ai juste fait 2-3 améliorations.

  3. #3
    ovh
    ovh est déconnecté
    Rédacteur
    Avatar de ovh
    Homme Profil pro
    Architecte devops web full stack
    Inscrit en
    Mai 2002
    Messages
    3 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 841
    Points : 6 514
    Points
    6 514
    Par défaut
    Je me dis que ça peut en intéresser plus d'un, voici donc le code complet pour lancer un exe et récupérer son output dans un Memo :
    Paramètres :
    - exe : le chemin complet de l'exécutable à lancer
    - param : les éventuels paramètres à lui passer en ligne de commande
    - log : un pointeur sur un composant TMemo
    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
     
    // Execute the file while capturing output and show it on memo
    bool launchExe(AnsiString exe, AnsiString param, const TMemo* log)
    {
      bool result = false;
     
      // We use pipes to capture the program output
      SECURITY_DESCRIPTOR sd;
      SECURITY_ATTRIBUTES sa;
      InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
      SetSecurityDescriptorDacl(&sd, true, NULL, false);
      sa.nLength = sizeof sa;
      sa.bInheritHandle = true;
      sa.lpSecurityDescriptor = &sd;
      HANDLE hReadPipe, hWritePipe;
      CreatePipe(&hReadPipe, &hWritePipe, &sa, 2500000);
     
      STARTUPINFO si;
      memset(&si, 0, sizeof si);    // default values for all structure members = 0
      si.cb = sizeof si;
      si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
      si.wShowWindow = SW_HIDE;     // hide the window (console application)
      si.hStdOutput = hWritePipe;
      si.hStdError = hWritePipe;
      PROCESS_INFORMATION pi;
      DWORD exitcode = 0;
      AnsiString cmdLine = shortPath(exe) + " " + param;
      if (CreateProcess(NULL, cmdLine.c_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi)) {
        WaitForSingleObject(pi.hProcess, 90000);    // wait for the external program to terminate
        CloseHandle(pi.hThread);                    //    with a timeout = 1 min 30 sec
        GetExitCodeProcess(pi.hProcess, &exitcode);
     
        // if the application wrote something to stdout (--> our pipe), grab it
        if (GetFileSize(hReadPipe, NULL) > 0) {
          DWORD bytesRead;
          char buffer[4000];
          bool moreData = false;
          while (!moreData) {
            memset(&buffer, 0, 4000);
            ReadFile(hReadPipe, &buffer, 4000, &bytesRead, NULL);
            log->Lines->Add(AnsiString(buffer));
            if (bytesRead < 4000) moreData = true; else moreData = false;
          }
        }
      }
     
      if (exitcode != 0) result = false; else result = true;
      return result;
    }

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

Discussions similaires

  1. Détecter Windows 2000 Professionnel
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/11/2006, 23h02
  2. [web] tester la validiter d'une URL
    Par zebiloute dans le forum Web
    Réponses: 4
    Dernier message: 25/11/2002, 16h51
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 12h29
  5. pb de handle en C
    Par deedje dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 16h19

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