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ü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.