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 842
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    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

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez � consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les r�gles.

    Je n'ai rien � voir avec la soci�t� www.ovh.com !

  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 842
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    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.

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez � consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les r�gles.

    Je n'ai rien � voir avec la soci�t� www.ovh.com !

  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 842
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Architecte devops web full stack

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 842
    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;
    }

    Tutoriels sur les UPS, e-commerce, PHP, critiques de livres...

    Pensez � consulter les FAQs et les cours et tutoriels.
    FAQ Linux - Cours et tutoriels Linux - FAQ PHP - Cours et tutoriels PHP
    Ce forum est fait pour vous et surtout par vous, merci d'en respecter les r�gles.

    Je n'ai rien � voir avec la soci�t� www.ovh.com !

+ 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