Fehler beim Registry-Eintrag lesen
-
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üllWas 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.