Riesenproblem beim auslesen eines Registrywertes



  • if (RegOpenKeyEx(hKey,"XYU\\abc",0,KEY_READ,&hKey2)!=ERROR_SUCCESS)
    {
    //Key exestiert nicht
    ....
    }

    else
    {
    DWORD RegType;
    RegType=REG_SZ;
    DWORD dwSize = sizeof(DWORD);

    if (RegQueryValueEx(hKey2,TEXT("Schlüssel1"),NULL,&RegType,(PBYTE)&strTemp,&dwSize) != ERROR_SUCCESS)
    {
    //Schlüssel exestiert nicht
    ....
    }
    else
    {
    //Schlüssel exestiert
    ....
    }
    if (RegQueryValueEx(hKey2,TEXT("Schlüssel2"),NULL,&RegType,(PBYTE)&strTemp,&dwSize) != ERROR_SUCCESS)
    {
    //Schlüssel exestiert nicht
    ....
    }
    else
    {
    //Schlüssel exestiert
    ....
    }
    RegCloseKey(hKey);
    RegCloseKey(hKey2);
    }



  • Was denkst Du Dir bei folgendem Cast:

    PBYTE)&strTemp
    

    😕 😕 😕



  • Das ist hal ein Cast, von einem Zeiger auf einen String in einen Zeiger auf den Datentyp BYTE!!!! Und bevor jetzt jemand motzt, das ist auch in Ordnung so. Wer es nicht glaubt, soll mal auf die Page von Microsoft schauen.



  • HALLO ??
    Wenn es in Ordnung wäre, würde Dein Code ja funktionieren!
    Weiterhin:

    DWORD dwSize = sizeof(DWORD);
    

    Du gibst vor, dass nur 4 Zeichen ausgelesen werden sollen. Wie soll er dann jemals 7 Zeichen auslesen?

    [ Dieser Beitrag wurde am 11.04.2003 um 15:42 Uhr von RenéG editiert. ]



  • Also in der MSDN ist die Funktion RegQueryValueEx so definiert:

    LONG RegQueryValueEx(
    HKEY hKey, // handle to key to query
    LPCTSTR lpValueName, // address of name of value to query
    LPDWORD lpReserved, // reserved
    LPDWORD lpType, // address of buffer for value type
    LPBYTE lpData, // address of data buffer
    LPDWORD lpcbData // address of data buffer size
    );

    Also, caste ich ja nur den Zeiger auf meinen Datenpuffer in den Typ(LPBYTE), ein Zeiger hat nun mal nur 4Byte, also ist das auch vollig in Ordung. Aber sorry, wegen der DWORD-Geschichte, das hatte ich schon abgeändert auf 256 Byte, da mein Datenpuffer soviel Bytes erfassen kann. Auserdem, der Text wird ja auch, wenn er zu lange ist in die Reg. geschrieben, nur nicht mehr ausgelesen.
    Und wenn ich die Reihenfolge der beiden Schlüssel, beim Auslesen, umdrehe liest er ja auch den einen aus!!!!!!????? Wie würdest du es denn Casten??



  • Der erste Aufruf setzt die Puffergröße auf die Anzahl der tatsächlich ausgelesenen Bytes. Den Wert musst du also zwischen den Aufrufen zurücksetzen.



  • Wie würdest du es denn Casten??

    Zeig doch mal die Deklaration von strTemp!



  • So, hab das Problem, nach einer Ewigkeit an Fehlersuche, endkich gelöst. Es hing nicht an den Casts, die waren völlig in Ordnung. Es wird nach dem ersten Abfragen eines Schlüssels, die tatsächlichen Anzahl der tatsächlich ausgelesenen Zeichen in den letzten Paramter geschrieben, in meinem Fall war das dwSize. Ist jetzt der zweite Schlüssel länger als der zu erst ausgelesene, gibt es natürlich einen Fehler. Also muss nach dem ersten Auslesen, dwSize wieder auf den Ausgangswert gesetzt werden.



  • Oh, bin wohl zu spät, hab gerade gesehen, dass mir das schon jemand geschrieben hat. Danke noch mal.



  • Da du mir nicht antworten willst, rate ich einfach mal!
    Es gibt 2 Möglichkeiten, wie Du strTemp deklariert haben könntest:
    1.
    char strTemp[WERT];
    2.
    CString strTemp;

    Bei beiden Deklarationen ist Dein Cast '(PBYTE)&strTemp' völlig falsch.

    Zusatz:
    Mein Beitrag vom 11.04.

    Du gibst vor, dass nur 4 Zeichen ausgelesen werden sollen. Wie soll er dann jemals 7 Zeichen auslesen?

    sollte Dich darauf hinweisen, dass der 2. Aufruf nie mehr Zeichen einlesen kann, als im Initialisierungswert von dwSize steht. Womit eigentlich selbstverständlich ist, dass man für den 2. Aufruf den Wert von dwSize auf mind. 7 setzen muss.


Anmelden zum Antworten