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 : 51
    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 : 51
    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. [Lisp] Variable considérée comme une fonction
    Par lunart dans le forum Lisp
    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