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 :

CloseHandle consid�r� comme une erreur par Memproof ! [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre �clair� Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par d�faut CloseHandle consid�r� comme une erreur par Memproof !
    Bonjour,

    J'ai cr�� la fonction suivante pour lister les fichiers d'un r�pertoire donn� :

    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
    void   __fastcall ListerFichiers(TStringList *liste, AnsiString NomRep, bool SousRep)
    {
    TSearchRec Rec;
     
    if (FindFirst(NomRep+"*.*", faAnyFile, Rec) == 0)
    {
        do
        {
            liste->Add(NomRep+Rec.Name);
            if ((Rec.Attr && faDirectory >0) && (Rec.Name[1] != '.') && (SousRep == true))
                ListerFichiers(liste, NomRep+Rec.Name, true);
        } while (FindNext(Rec) == 0);
        FindClose(Rec);
    }
    }
    Or lorsque je teste mon code avec MemProof, il d�tecte � chaque fois des erreurs lors de l'utilisation de FindFirst, il indique :

    FindFirstFile("nom_du_fichier_trouv�") Error $0000010B
    C'est �tonnant qu'il affiche FindFirstFile, alors que j'utilise FindFirst de la VCL, mais bon, passons... J'ai essay� d'utiliser FindFirst en dehors de cette fonction, et j'ai le m�me type d'erreur avec MemProof.

    J'ai le m�me type de probl�me avec CloseHandle (cf mon message un peu + bas)...

    D'o� peut venir ce souci ? Y'a-t'il une autre fonction que FindFirst pour lister les fichiers ?

    En vous remerciant pour vos id�es...

  2. #2
    Membre �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par d�faut
    Hello

    A vue de pif, je dirais que 0x10b �a peut correspondre � 'The directory name is invalid.', comme code d'erreur (d'apr�s ERRLOOK, le p'tit outil de Visual Studio).
    Memproof t'indique tous les codes d'erreur renvoy�s par les fonctions de l'API. Comme FindFirstFile (qui est appel�e par FindFirst, cf. SysUtils.pas) doit se lourder sur le nom de fichier, tu r�cup�res �a comme erreur (j'imagine que tu ne passes pas dans ta boucle do...while).

    A++

  3. #3
    Membre �clair� Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par d�faut
    Merci pour ces pr�cisions

    Je regarde de ce c�t� et je vous tiens au courant... Apparemment ce sont des fichiers et non des r�pertoires, d'o� l'erreur...

  4. #4
    Membre �clair� Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par d�faut
    J'ai corrig� ma fonction :

    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
    void   __fastcall ListerFichiers(TStringList *liste, AnsiString NomRep, bool SousRep) 
    { 
    TSearchRec Rec; 
     
    if (FindFirst(NomRep+"*.*", faAnyFile, Rec) == 0) 
    { 
        do 
        { 
            liste->Add(NomRep+Rec.Name); 
            if ((Rec.Attr == faDirectory) && (Rec.Name[1] != '.') && (SousRep == true))
                ListerFichiers(liste, NomRep+Rec.Name, true); 
        } while (FindNext(Rec) == 0); 
        FindClose(Rec); 
    } 
    }
    C'�tait if ((Rec.Attr && faDirectory >0) qui bugait : il me retournait tous les fichiers comme �tant des r�pertoires ! Alors que if ((Rec.Attr == faDirectory) ne retourne que les r�pertoires.

    Je n'ai donc plus les erreurs retourn�es par FindFirstFile.

    Encore merci !

  5. #5
    Membre �clair� Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par d�faut
    J'ai �galement un probl�me avec MemProof pour le code suivant :

    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
    // Fonction permettant de connaitre l'id d'un processus
    DWORD __fastcall GetProcessId(char *nomProgramme)
    {
    HANDLE         handle;
    DWORD          pId;
    PROCESSENTRY32 pe;
    bool fin;
    fin = false;
    pId = 0; 
    pe.dwSize = sizeof(PROCESSENTRY32); 
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL , 0);  //recupere un capture de process 
    if ( Process32First(handle, &pe) == true)// recherche premier process de la liste 
    {  // on a le premier process de la liste => il faut vérifier si c'est celui-là 
        if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme)) 
        {  // le process correspond à celui qu'on cherche 
            pId = pe.th32ProcessID;   // recupere l'id du process 
        } 
        else 
        { 
            while ((Process32Next(handle, &pe) == true) && (fin == false)) 
            {  //dans le cas contraire du test on continue à chercher le process en question 
                if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme)) 
                { 
                    pId = pe.th32ProcessID; 
                    fin = true; // On a trouvé, on peut arrêter la recherche
                } 
            }
        }
    }
    CloseHandle(handle);
    return(pId);
    }
    Sur CloseHandle(handle);, MemProof me renvoie l'erreur suivante : Attempt to free unexisting ressource $00000550, $000005C0, $00000560...

    Or handle n'est pas �gal � NULL, et la documentation de Windows indique qu'il faut bien fermer le handle apr�s un CreateToolhelp32Snapshot.

    Auriez-vous des solutions pour corriger cette erreur ?

  6. #6
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    bonsoir,
    pour ton premier code voici une version utilisant les API win 32
    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
     
    void __fastcall TSearchThread::Win32Search(AnsiString Name)
    {
     WIN32_FIND_DATA wrec;
     HANDLE FileHandle;
     wrec.dwFileAttributes=0x3f;
     AnsiString tmp=Name+"*.*";
     FileHandle=FindFirstFile(tmp.c_str(),&wrec);
     if (FileHandle!=INVALID_HANDLE_VALUE)
       {
        do
        {
         tmp=wrec.cFileName;
         if((tmp !=".")&&(tmp!=".."))
            mContent->Add(Name+tmp);
         if ((wrec.dwFileAttributes && FILE_ATTRIBUTE_DIRECTORY >0) && ((tmp !=".")&&(tmp!="..")))
         Win32Search(Name+tmp+"\\");
        }
        while(FindNextFile(FileHandle,&wrec) != 0);
        FindClose(FileHandle);    //TODO: Add your source code here
       }
     
    }
     
    // mContent est une String List
    // lors du premier appel de la fonction on vérifie la présence de "//" a la fin du chemin
    concernant ton code pour la recher du PID j'ai apport� une modification mineure a ton code , je n'ai par contre pas constat� les erreurs que tu a anonc�s

    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
     
     
     
    {
    HANDLE         handle;
    DWORD          pId;
    PROCESSENTRY32 pe;
    pId = 0;
    pe.dwSize = sizeof(PROCESSENTRY32);
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL , 0);  //recupere un capture de process
     
    if ( Process32First(handle, &pe) == true)// recherche premier process de la liste
    {  // on a le premier process de la liste => il faut vérifier si c'est celui-là
        if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
        {  // le process correspond à celui qu'on cherche
            pId = pe.th32ProcessID;   // recupere l'id du process
        }
        else
        {
            while ((Process32Next(handle, &pe) == true) && (pId == 0))
            {  //dans le cas contraire du test on continue à chercher le process en question
                if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
                    pId = pe.th32ProcessID;
            }
        }
    }
    CloseHandle(handle);
    return(pId);
    }
    cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  7. #7
    Membre �m�rite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par d�faut
    Pareil que DjmSoftware, j'ai essay� ton code et pas d'erreur ..!?!

    Juste une remarque, histoire d'�tre s�r: quand tu fais CreateToolhelp32Snapshot, teste la valeur de retour avant de continuer. Si ca vaut INVALID_HANDLE_VALUE, ne va pas plus loin (pas de CloseHandle) (cf. l'exemple de code dans MSDN)

    A++

  8. #8
    Membre �clair� Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Par d�faut
    Merci � vous deux, j'ai effectu� les modifications que vous m'avez indiqu�es pour ma fonction GetProcessId :

    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
    DWORD __fastcall GetProcessId(char *nomProgramme)
    {
       HANDLE         handle;
       DWORD          pId;
       PROCESSENTRY32 pe;
     
       pId = 0;
       pe.dwSize = sizeof(PROCESSENTRY32); 
       handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL , 0);  //recupere un capture de process
       if(handle!=INVALID_HANDLE_VALUE)
       {
          if ( Process32First(handle, &pe) )// recherche premier process de la liste
          {  // on a le premier process de la liste => il faut vérifier si c'est celui-là
             if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
             {  // le process correspond à celui qu'on cherche
                pId = pe.th32ProcessID;   // recupere l'id du process
             }
             else
             {
                while ((Process32Next(handle, &pe)) && (pId == 0))
                {  //dans le cas contraire du test on continue à chercher le process en question
                   if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
                      pId = pe.th32ProcessID;
                }
             }
          }
          CloseHandle(handle);
       }
     
       return(pId);
    }
    mais j'ai toujours des soucis avec MemProof. Je pense que c'est parce que les processus � chercher n'existent pas... et il doit y avoir un CloseHandle de trop (ou mal plac�) du coup...

    J'ai essay� de changer la place du CloseHandle (en le mettant dans la boucle du if ( Process32First(handle, &pe) ) ), mais MemProof m'indique toujours Attempt to free unexisting ressource . Je ne vois pas trop ce qui cloche

Discussions similaires

  1. [script.aculo.us] Ajax update n'est pas consid�r� comme une requete ajax
    Par Gregory.M dans le forum Biblioth�ques & Frameworks
    R�ponses: 0
    Dernier message: 08/06/2010, 11h35
  2. 2.4.2 envoyer une erreur par mail
    Par Benoit_Durand dans le forum D�veloppement de jobs
    R�ponses: 1
    Dernier message: 07/01/2009, 11h00
  3. R�ponses: 6
    Dernier message: 21/10/2007, 15h11
  4. R�ponses: 2
    Dernier message: 29/04/2007, 15h35
  5. R�ponses: 2
    Dernier message: 07/04/2005, 15h48

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