Enumération incomplète avec RegEnumKeyEx [Résolu]

Signaler
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour, dans un programme je dois énumérer toutes les clefs de HKEY_CURRENT_USER, j'ouvre donc cette clef, je récupère le nombre de subkeys (RegQueryInfoEx), ensuite j'énumère toutes les subkeys avec RegEnumKeyEx, dans mon HKEY_CURRENT_USER, il y'a 15 subkeys, la fonction RegEnumKeyEx devrait donc me les énumérer toutes, le problème étant qu'elle me renvoie un erreur de code 234 (ERROR_MORE_DATA) ce qui veut dire que le buffer recevant le nom de la clef est trop petit, pourtant j'ai beau l'agrandir, j'ai toujours la même erreur... si vous avez deja rencontré le meme pb...

Voici le code :

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
DWORD X 0, dwSubKeys 0;

void enumKeys()
{
    HKEY hKey;
    DWORD dwNameLen;
    PCHAR pnameSubKey;

    if(RegOpenKeyExA(HKEY_CURRENT_USER, NULL, 0, 0xF003F, &hKey) != ERROR_SUCCESS) {
   
        MessageBoxA(NULL, "Error RegOpenKeyEx", "Error", MB_OK);
        return ;
     }   

    if(RegQueryInfoKeyA(hKey, NULL, 0, NULL, &dwSubKeys, NULL,
         NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {
   
             MessageBoxA(NULL, "Error RegQueryInfoKey", "Error", MB_OK);
             return ;
     }
    printf("Num: %d\n\n", dwSubKeys);

    for(int i = 0; i < dwSubKeys; i++) {
       
        CHAR nameSubKey[10000];

        if(X >= dwSubKeys) exit(0);

        if(RegEnumKeyExA(hKey, X, nameSubKey, &dwNameLen,
             NULL, NULL, NULL, NULL) != ERROR_SUCCESS) {

                 printf("Ret: %d\n\n", RegEnumKeyExA(hKey, X, nameSubKey,
                            &dwNameLen, NULL, NULL, NULL, NULL));
           
            return ;   
        }

        X++;
        printf("SubKey: %s\n", nameSubKey);
    }

    RegCloseKey(hKey);
}

int main(int argc, char *argv[])
{
    for(int i = 0; i < 10; i++) enumKeys();
    return 0;
}

Si vous pouvez m'éclaires, meci

___________________
MSP - Microsoft Student Partner (Microsoft)

2 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Un exemple de "goto" judicieux au lieu d'accolades à rallonges:
if(RegQueryInfoKeyA(hKey, ...)) goto keyCLOSE;
.....
.....
keyCLOSE:
RegCloseKey(hKey);

éviterait d'oublier de fermer le handle de clé et aussi de mettre plusieurs appels RegCloseKey.

ciao...
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

dsl, problème réglé, il suffisait de donner une valeur à dwNameLen, dsl :s

___________________
MVS - Most Valuable Student ( Microsoft)