regQueryValue() läuft nich wie es sollte
-
Hi
ich möchte einen bestimmten Registrywert auslesen. Mir ist der komplette Pfad bekannt, der Name des Eintrags ist "Portname".
Nachdem ich festgestellt habe dass regGetValue() nicht unter XP x32 funktioniert habe ich mich für regQueryValue() entschieden. Soweit ich das bis jetzt (von MSDN und Beispielcodes) verstanden habe muss ich vorher mit regOpenKey() den Schlüssel öffnen.
Aber es passiert nichts mit den Variablen.Hier ist mein Code, wie ich ihn mir aus mehreren Beispielen aus dem Internet zusammengeschustert habe.
#include <windows.h> #include <stdio.h> int main() { HKEY hkey = HKEY_LOCAL_MACHINE; RegOpenKeyA(hkey,"SYSTEM\\...\\Device Parameters\\PortName",&hkey); char dwText [MAX_PATH] = ""; DWORD lpcbData = sizeof(dwText); RegQueryValueExA(hkey, "SYSTEM\\...\\Device Parameters\\PortName", NULL, NULL, (LPBYTE)&dwText, &lpcbData); RegCloseKey(hkey); printf("Wert: %c , Groesse: %i\n",dwText[0],lpcbData); return 0; }Man muss dazu sagen, dass nicht ein einziges Beispielprogramm aus dem Netz funktioniert hat. Ich habe ständig Fehler, wie falsche Typen bei den Parametern usw bekommen. Ich glaube ich habe bis jetzt schon jede erdenkliche Variation dieser Funktion durch.
Vielleicht könnt ihr mich vom Gegenteil überzeugen und mir einen funktionierenden Code zeigen
-
Du solltest *immer* die Rückgabewerte prüfen, sonst kann man gar nichts sagen....
-
"SYSTEM\...\\Device Parameters\\PortName"
1. du gibst nicht wirklich diese Pfadangabe an oder

2. Hast du Administrative rechte um auf die Registry zuzgreifen? Mit RegOpenKeyEx kannst du Sicherheits und zugriffrechte bestimmen
3. RegOpenKey hat einen return wert! was gibt dir RegOpenKey zurück?
MSDN schrieb:
Return Value
If the function succeeds, the return value is ERROR_SUCCESS4. würde ich folgende Parameter wie folgt deklarieren
DWORD dwType=REG_NONE; BYTE Data[1024]=""; DWORD dwDataSize=sizeof(Data); RegQueryValueEx(hKey, ..., ..., &dwType, (BYTE*) Data, &dwDataSize);5. auch RegQueryValueEx hat einen return wert (siehe wie oben).was gibt dir RegQueryValueEx zurück?
6. dwText[0]
gibt dir, sofern etwas in dwText stehen würde, nur das erste zeichen zurück.wie folgt sollte es eine ausgabe geben sofern Data mit werden befüllt ist und alle funktione mit ERROR_SUCCESS beendet wurden.
printf("Wert: %s , Groesse: %d\n",(char*) Data,lpcbData);
-
zu 1.: Nein das sollte das ganze nur abkürzen. Ich verwende den kompletten Pfad ohne die Punkte

zu 2.: Ja ich habe Admin-Rechte...zumindest kann ich Werte in der Registry ändern ohne Meldungen zu bekommen
zu 3.: RegOpenKey gibt 2 zurück. Das heißt laut MSDN "File not Found"
zu 4.: jop
zu 5.: RegQueryValueEx gibt 6 zurück( invalid Handle) RegCloseKey gibt auch 6 zurück
zu 6.: Das war nur ein Relikt aus einem Versuch den ich gestartet habe
hab vergessen das wieder zurückzuändernDie Pfadangabe ist eigentlich so korrekt. zumindest habe ich sie so aus der Registry kopiert

-
mit blindheit geschlagenPortName ist der Wert den du suchst und aus dem du daten haben willst, nehm ich jetzt einfach mal an...
hab nach dem pfad nämlich grad selbst mal im meiner regi gesucht und nix gefunden
pfad öffnen
RegOpenKeyA(hkey,"SYSTEM\\...\\Device Parameters",&hkey);mit RegOpenKeyA öffnest du den Pfad (ordner) "Device Parameters" und übergibst ihn an hkey. hkey hat jetzt ein handle auf
HKEY_LOCAL_MACHINE\\SYSTEM\...\\Device Parametersdaten auslesen
RegQueryValueExA(hkey, "PortName", NULL, NULL, (LPBYTE)&dwText, &lpcbData);RegQueryValueExA benutzt das Handle von hkey um unter diesem Ordner den angegebenen wert (PortName) zu suchen. wenn dieser dort vorhanden ist, werden die Daten dort ausgelesen und in dwText geschrieben.
-
Paddre schrieb:
zu 3.: RegOpenKey gibt 2 zurück. Das heißt laut MSDN "File not Found"
Hmmm, schon die erste (!) Funktion in Deinem Quellcode ist fehlgeschlagen.
Und alle weiteren Funktionen sind zwangsläufig zum Scheitern verurteilt.Dann ist Dein angegebener Pfad falsch oder fehlerhaft.
Wo hast Du ihn her?
Doch nicht von einem anderen PC?Poste bitte Deinen Quellcode ungekürzt hier im Forum (naja, gewaltig aufblähen darf er andererseits natürlich nicht).
D.h. mit vollständigen Pfadnamen.Martin
-
Jawolle danke hat geklappt
