Fehler beim Registry-Eintrag lesen



  • bool CheckRegistry(string fullKeyName)
    {
    CRegKey reg;
    LPCTSTR lpszKey = fullKeyName.c_str();
    reg.Open(HKEY_CURRENT_USER, lpszKey, KEY_ALL_ACCESS | KEY_WRITE);
    char buffer[256];
    ULONG StrLength = 0L;
    reg.QueryStringValue("ProgID",buffer,&StrLength);
    reg.Close();

    ...
    }

    Ich kriege hier einen Debug Assert error in der atlbase.h, und zwar in der Zeile reg.Querystring("ProgID", buffer, &StrLength);

    Der Fehler lautet :

    Debug Assertion Failed !
    Line: 5025
    Expression: m_hKey != 0

    Ich arbeite mit VS.NET 2003

    Hat irgendjemand eine Idee was ich hier falsch mache ?



  • CRegKey::Open gibt einen LONG zurück, der dir sagt, ob das Öffnen erfolgreich war. Zumindest solltest du diesen Wert mal prüfen.



  • Hab ich gerade mal versucht, er gibt mir eine 2 als Wert zurück. <>0 heisst doch erfolgreich oder ? Der Pfad stimmt auch ...



  • Lynix schrieb:

    <>0 heisst doch erfolgreich oder ?

    Wenn du dir da nicht sicher bist, schau in die Dokumentation. ERROR_SUCCESS bedeutet Erfolg, und ERROR_SUCCESS ist bei mir 0. 2 ist ERROR_FILE_NOT_FOUND.

    Lynix schrieb:

    Der Pfad stimmt auch ...

    Offenbar wohl doch nicht.



  • Du hattest Recht, ich hatte den Pfad durcheinandergeworfen. Also mittlerweile kriege ich beim Öffnen eine 0 als Rückgabewert und es stürzt nicht mehr ab.
    Nach dem Lesen steht in meinem Buffer aber trotzdem nur Müll 😞

    Was muss denn genau in den ersten Parameter von QueryStringValue reingeschrieben werden ? Nochmal der komplette Pfad oder nur noch der Value-Name ? Da ich jetzt Beides ausprobiert hab und sich trotzdem nix geändert hat, vermute ich mal ganz was Anderes...

    Aus der MSDN werd ich leider nicht schlau :

    LONG QueryStringValue(
    LPCTSTR pszValueName,
    LPTSTR pszValue,
    ULONG* pnChars
    )

    pszValueName
    Pointer to a null-terminated string containing the name of the value to query (??)

    P.S.: In meinem Registry-Eintrag steht ein ganz normaler Zeichenfolgen-Wert.



  • pszValueName muss nur den Wertnamen enthalten. Aber in pnChars (genauer: in der Variablen, auf die pnChars zeigt) muss stehen, wieviele Zeichen pszValue aufnehmen kann. Wenn du da 0 angibst, kann das nicht funktionieren.



  • Danke für die Antwort erstmal.

    Ich hab es jetzt versucht und StrLength = 29 gesetzt (der Wert in der Registry, den ich auszulesen versuche ist immer 29 Zeichen lang). Ausserdem hab ich auch den buffer als char buffer[29] angelegt.

    Leider geht es immer noch nicht. Während er beim Öffnen die Returnvalue 0 zurückgibt, kriege ich bei QueryStringValue als Returnwert 234 zurück, was laut WINERROR.H die Fehlermeldung "MORE_DATA" ist. Leider finde ich auch darüber nix in der MSDN ...

    Sorry wenn ich nerve, aber mir fällt echt sonst nix mehr ein wo ich fragen könnte...

    EDIT:

    mit buffergröße 256 und StrLength 256 geht es auch nicht, ebenso Returnwert 234 und nur Müll im buffer....



  • Was steht denn nach dem Aufruf in StrLength?



  • Nach dem Aufruf steht in StrLength wieder 0, frag mich aber nicht warum 😞



  • Das Problem hat sich erledigt, habe den Fehler gefunden. Ich hate bei StrLength 256 anstatt 256L geschrieben.

    Danke nochmals @MFK



  • Lynix schrieb:

    Das Problem hat sich erledigt, habe den Fehler gefunden. Ich hate bei StrLength 256 anstatt 256L geschrieben.

    Das kann nicht die Ursache gewesen sein.



  • Ist das Einzige, was ich geändert habe, habs gerade nochmal probiert.

    So geht es nicht :

    bool CheckRegistry(string fullKeyName)
    {
    bool retVal = true;
    CRegKey reg;
    LPCTSTR lpszKey = fullKeyName.c_str();
    LONG ret = reg.Open(HKEY_CURRENT_USER, lpszKey, KEY_ALL_ACCESS | KEY_WRITE);
    char buffer[256];
    ULONG StrLength = 256;
    LONG ret2 = reg.QueryStringValue("ProgID",buffer,&StrLength);
    reg.Close();

    return ProgID_ISValid(buffer);
    }

    Bei der obigen Variante kriege ich bei QueryStringValue den Rückgabewert 234 (FEHLERCODE : MORE_DATA)

    Damit gehts allerdings :

    bool CheckRegistry(string fullKeyName)
    {
    bool retVal = true;
    CRegKey reg;
    LPCTSTR lpszKey = fullKeyName.c_str();
    LONG ret = reg.Open(HKEY_CURRENT_USER, lpszKey, KEY_ALL_ACCESS | KEY_WRITE);
    char buffer[256];
    ULONG StrLength = 256L;
    LONG ret2 = reg.QueryStringValue("ProgID",buffer,&StrLength);
    reg.Close();

    return ProgID_ISValid(buffer);
    }

    Rückgabewert ist 0 und im Buffer steht genau der Wert aus der Registry.


Anmelden zum Antworten