Registry: Handle wird nicht frei...



  • Hallo!

    folgendes Problem:

    Ich habe endlich mal in WinXP-Registry gefunden wo die einzelnen Portadressen der Schnittstellen abgelegt sind(COM, LPT). Es kann ja mal passieren dass es mehrere sind daher eine Schleife... Beim ersten mal liest er brav die Werte raus, nun kommt der nächste Wert dran. Nach RegCloseKey() müsste eiglentlich keyreg-Variable frei sein, ich denke mal NULL als Wert haben, hat es aber nicht:( bei nächstem RegOpenKeyEx wird sie auf NULL gesetzt und ich die Funktion liefert ist nicht mehr ERROR_SUCCESS! Was ist hier faul???

    CString schluesselroot = "HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter\\5\\";
            CStrin schluessel = schluesselroot + "SerialController\\";
            TRACE("COMx:\n");
            for (DWORD i=0; i<3; i++)
            {
                ultoa(i, &itemp, 10);
                schluessel += itemp;
                if (RegOpenKeyEx(
                        HKEY_LOCAL_MACHINE,
                        schluessel.GetBuffer(schluessel.GetLength()),
                        NULL,
                        KEY_QUERY_VALUE | KEY_READ,
                        ®key) == ERROR_SUCCESS)
                {
                    lpdwType = REG_RESOURCE_LIST; //REG_SZ
                    if (RegQueryValueEx(
                            regkey, 
                            "Configuration Data", 
                            NULL, 
                            &lpdwType,
                            bufferreg,
                            &bufferregsize) != ERROR_SUCCESS)
                        TRACE("RegQueryValue Error\n");
                    TRACE("%02X%02X:", bufferreg[21], bufferreg[20]);
                    lpdwType = REG_SZ; //REG_SZ
                    if (RegQueryValueEx(
                            regkey, 
                            "Identifier", 
                            NULL, 
                            &lpdwType,
                            bufferreg,
                            &bufferregsize) != ERROR_SUCCESS)
                        TRACE("RegQueryValue Error\n");
                    TRACE("%s:\n", bufferreg);
                    if (RegCloseKey(regkey) != ERROR_SUCCESS)
                        TRACE("RegCloseKey Error\n");
                }
    

    Vielen Dank schon mal im Voraus!

    Russak

    [ Dieser Beitrag wurde am 14.05.2003 um 12:14 Uhr von Russak editiert. ]

    [ Dieser Beitrag wurde am 14.05.2003 um 12:16 Uhr von Russak editiert. ]



  • Du fragst die Rückgabewerte der Registry-Funktionen falsch ab. Im Erfolgsfalle wird ERROR_SUCCESS geliefert. Korrekt muß es heißen:

    if(ERROR_SUCCESS == RegXXX())
    {
        // Erfolgreich
    }
    


  • Hi!

    ich mache auch genau das... Aber trotzdem was es hier der Fehler? weil ein mal funktioniert es.

    Russak



  • Ach Du liebe Zeit, jetzt sehe ich das auch. 🙄
    Aber wenn nicht ERROR_SUCCESS gelifert wird, was dann? Lasse Dir den Wert doch einfach mal anzeigen.

    [edit] Du speicherst das Key-Handle in key, arbeitest dann aber mit regkey weiter. Ist der Fehler beim Copy&Paste passiert? [/edit]

    [ Dieser Beitrag wurde am 14.05.2003 um 12:49 Uhr von -King- editiert. ]



  • Hi!

    das mit dem key bzw. regkey liegt irgendwie an dem Browser:( ich benutze schon die gleichen Variablen! Als Error liefert die Funktion mir bei zweitem Durchlauf einen Wert = 2.

    Russak



  • Aus <winerror.h>:

    //
    // MessageId: ERROR_FILE_NOT_FOUND
    //
    // MessageText:
    //
    //  The system cannot find the file specified.
    //
    #define ERROR_FILE_NOT_FOUND             2L
    

    Den Schlüssel, den Du öffnen möchtest, gibt es offensichtlich gar nicht.



  • Hi!

    habe mir das auch schon gedacht wenn ich aber jetzt direkt i auf 1 setze dann gehts, aber wieder nur ein mal!

    Fehlt dir da was auf bei der Erzeugung des Strings für den schlüssel?

    Russak



  • Mir 'fehlt' da was auf, ja. Und wenn Du Dir den String mal anzeigen lassen würdest, wäre Dir das auch schon 'aufgefehlt'. Das liegt an Deinem +=.



  • Hi!

    habe zumindestmal einen Fehler gefunden:)

    vorher:

    schluessel += itemp;
    

    jetzt:

    schluessel = schluesselroot + "SerialController\\" + itemp;
    

    Ich habe immer dazu addiert:( Also aber der Fehler ist immer noch da und zwar
    bei RegQuery...
    Wert = 234, entpsricht glaube ich:

    //
    // MessageId: ERROR_MORE_DATA
    //
    // MessageText:
    //
    // More data is available.
    //
    #define ERROR_MORE_DATA 234L // dderror

    Was kann denn das sein???

    Russak



  • Der übergebene Buffer ist zu klein. Ich sehe auch nirgendwo die Initialisierung von bufferregsize.



  • BYTE bufferreg[1024] = {0};
       DWORD bufferregsize = sizeof(bufferreg);
    

    Aber mit 10000 hats gerade auch nicht funktioniert:( Kommisch ist auch dass das erste Mal ohne Probleme alles läuft...

    Russak

    [ Dieser Beitrag wurde am 14.05.2003 um 13:20 Uhr von Russak editiert. ]



  • Die Variable bufferregsize wird beim Aufruf von RegQueryValueEx mit der tatsächlichen Grösse des Wertes überschrieben. Sie muss vor dem nächsten Aufruf wieder auf sizeof(bufferreg) gesetzt werden.

    Gruss Christian



  • Hallo!

    VIELEN DANK!

    es lag tatsächlich daran!
    Na ja wenn man ALLES lesen würde was in der Doku drin steht würde man glaube ich viel viel mehr, ich meine weniger, Fehler machen 🙂

    lpcbData
    Pointer to a variable that specifies the size, in bytes, of the buffer pointed to by the lpData parameter.
    When the function returns, this variable contains the size of the data copied to lpData.
    Gruß
    Russak

    [ Dieser Beitrag wurde am 14.05.2003 um 17:00 Uhr von Russak editiert. ]

    [ Dieser Beitrag wurde am 14.05.2003 um 17:01 Uhr von Russak editiert. ]


Anmelden zum Antworten