RegEnumValue liefert Fehler (ERROR_MORE_DATA)



  • Hallo,

    ich versuche mich gerade am Auslesen der Registry.

    Leider liefert mir die Funktion RegEnumValue beim zweiten Aufruf einen Fehler 234, ERROR_MORE_DATA.

    Nun gehe ich davon aus, dass der angelegte Speicher zu wenig ist. Meines Erachtens kann das aber gar nicht sein.

    Hier mein Codebsp:

    ...
    
    char          pacName[4096] = "";
    DWORD         nNameCount    = 4096;
    unsigned char pabValue[4096] = "";
    DWORD         nValueCount   = 4096;
    DWORD         nValueType    = REG_SZ; // Null terminierter String
    
    while((nLastError = RegEnumValue(hRegistryKey,
                                     nRegEntryNr, 
                                     pacName,
                                     &nNameCount,
                                     0,
                                     &nValueType,
                                     pabValue,
                                     &nValueCount)) != ERROR_NO_MORE_ITEMS)
    {
      ++nRegEntryNr;
    }; 
    ...
    

    Der Name des Wertepaares ist beim zweiten Aufruf nicht mehr korrekt. Meine testeintraege sind einfach durchnummeriert, 01, 02, 03 ...
    Mit dem oben angegebenen Speicherplatz sollte man doch locker hinkommen.

    Was laeuft hier schief?

    Gruss



  • Die Funktion setzt die Größenangaben der beiden Puffer auf die tatsächliche Datenlänge - d.h. beim zweiten Aufruf gibst du als Puffergrößen die Länge des ersten Datensatzes an. Wenn du in jedem Schleifendurchlauf die volle Puffergröße ausnutzen willst, mußt du in der Schleife die Werte nNameCount und nValueCount wieder auf den Ausgangswert zurücksetzen.

    (übrigens: Die Typ-Angabe mußt du nicht vorbesetzen - die wird von der Funktion selber gesetzt - und wenn du nur die Einträge zählen willst, kannst du die letzten beiden Parameter auf NULL setzen)



  • Hallo,

    danke fuer deine Antwort.

    Wenn ich aber die Puffergroesse des ersten Satzes angebe sollte es doch trozdem funktionieren wenn alle Namen die gleiche Laenge haben!?

    Gruss



  • Nein. Du gibst die Gesamtgröße des Puffers (inklusive abschließendem \0) an, die Funktion gibt dir die tatsächliche Textlänge (ohne \0) zurück - das heißt für den zweiten Aufruf ist der Puffer ein Byte zu kurz.

    erster Aufruf:
    buf = [     ], len = 5
      RegEnumValue(...,buf,&len,...)
    buf = [01\0  ], len = 2
      RegEnumValue(...,buf,&len,...)
    -> Buffer zu kurz für 2 Zeichen + \0 -> BUMM
    


  • Hi,

    danke fuer die Antwort.

    Stimmt wenn das eine mit abschliessender 0 und das andere ohne sie ist geht das so nicht.

    Schade das man den Namen nicht weglassen kann, ich baeuchte in meinem Programm nur das Value eines Wertepaares, den Namen brauche ich nicht.

    Gruss


Log in to reply