Problem mit RegEnumValue
-
meine RegEnumValue Funktion
BOOL EnumStrValue(HKEY hMasterKey, LPCTSTR lpSubKey, DWORD dwIndex, LPTSTR lpValueName) { HKEY hKey; DWORD dwType=REG_NONE; DWORD dwValueNameSize; BYTE Data[DATASIZE]=""; DWORD dwDataSize; //RegOpenKeyEx(hMasterKey, lpSubKey, NULL, KEY_QUERY_VALUE,&hKey); RegOpenKey(hMasterKey, lpSubKey,&hKey); LONG Result = RegEnumValue(hKey, dwIndex, lpValueName, &dwValueNameSize, NULL, &dwType, (BYTE*)Data, &dwDataSize); RegCloseKey(hKey); return (Result == ERROR_SUCCESS); }meine schleife in der ich alle werte abfrage
INFOKEY InfKey; QueryInfoKey(hMasterKey, szSubKey, &InfKey); for (DWORD dw=0;dw<InfKey.dwValues;dw++) { char szValueName[1024]; EnumStrValue(hMasterKey, szSubKey, dw,szValueName); DWORD dwLen = QueryStrValueEx(hMasterKey, szSubKey, szValueName, szParameter); ... }meine funktion QueryInfoKey funktioniert im debug & release modus, in beiden fällen liefert es mir die korreckte anzahl an werten in dem schlüßel.
-
dein dwValueNameSize und dwDataSize ist zb ned initialisiert.
-
ok hab's abgeändert
DWORD dwValueNameSize=sizeof(lpValueName); BYTE Data[1024]=""; DWORD dwDataSize=sizeof(Data);mit dem unterschied das mir ein andere wert angezeigt wird als ohne inizialisierung jedoch werden weiterhin alle anderen werte verschluckt.
-
Du darfst keinen neuen Schlüssel öffnen, das macht doch keinen Sinn.
Warum behandelst Du nicht alles in einer Schleife ohne diese Extra Funktion, die sowieso überflüssig ist.
-
Du darfst keinen neuen Schlüssel öffnen, das macht doch keinen Sinn
hmm nun ja mir hat das niemand gezeigt wies richtig gehen könnte, und nen sinn hat das für mich schon, ich hab mir ne ganze klasse gemacht die mir registry funktionen bereitstellt. da es mir sehr lästig war jedes mal wenn ich irgendwo nen wert aus der registry haben wollte erst die registry zu öffnen dann wieder zu schließen (bzw. das nicht zu vergessen) hab ich das in die jeweilige funktion gelegt.
ich geb dir natürlich recht wenn man das in einer schleife macht ist es überflüßig. ne kühlschranktür macht man ja auch nicht auf und zu bis man alles zum essen hat.
aber ich habs jetzt gefunden woran es lag. anscheinend muss man bei RegEnumValue die DWORD werte nicht mit sizeof belegen sondern direckt mit einem wert. jedenfals funzt es jetzt.
DWORD dwValueNameSize=1024; DWORD dwDataSize=1024;
-
Sicher solltest Du sizeof verwenden, feste Werte sind kein guter Stil. Nur musst Du es vor jedem Aufruf erneut machen.
-
würde ja gerne sizeof verwenden nur funzt dann RegEnumValue in der release version nicht. mir schmeckt das selber so nicht.
...
und genau das mach ich ja, vor jedem aufruf die DWORD werte erneut mit sizeof belegen, da meine funktion ja in einer schleife aufgerufen wird.bei jeder anderen registry funktion klappt das auch mit sizeof, nur eben nicht bei RegEnumValue.
-
Kein Wunder:
DWORD dwValueNameSize=sizeof(lpValueName);liefert 4, denn der Zeiger ist nur 4 Bytes groß. Es gibt in C++ hier keine Möglichkeit zu ermitteln, wie groß der Array ist auf den der Zeiger verweist.
-
hmm,
das heist also ich muss die größe für die DWORD werte direckt von der variable selbst ermitteln & mit übergeben.
-
@rT!f@Ct schrieb:
hmm,
das heist also ich muss die größe für die DWORD werte direckt von der variable selbst ermitteln & mit übergeben.Was hast denn Du gedacht?
Diese DWORDs geben an, wieviel Daten übertragen werden dürfen. Entsprechend wird auch aufgehört, wenn eben nicht alle Daten übertragen werden.Alleine dadurch, dass Du eine separate Funktion EnumStrValue geschaffen hast, hast Du Dir mehr Probleme als Vorteile verschat. Warum verwendest Du nicht die entsprechendne API Funktionen in der Loop