REG_DWORD problem
-
habe eine kleine funktion, die einen DWORD-wert in die registry schreiben soll.
in regedit stand dann ein "ungültiger wert" oder neuerdings gar nix!hier der (leicht gekürzte) code:
[cpp]
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <winreg.h>void reginsert(char *name, int *content, char *keytarget);
int main() {
char target[255] = "Software\\Company\\Product\\Version";
int dwordval01 = 9;
reginsert("test 2", **&**dwordval01, target);
return 0;
}void reginsert(char *name, int *content, char *keytarget) {
HKEY hKey;
RegCreateKey(HKEY_CURRENT_USER, keytarget, &hKey);
RegSetValueEx(hKey, name, 0, REG_DWORD, (LPBYTE) content, sizeof(content));
RegCloseKey(hKey);
return;
}
[/cpp]wo ist der fehler?
thanks in advance :

---loki
-
So, wie der Code dort steht, dürfte es sich gar nicht kompilieren lassen.
void reginsert(char *name, int *content, char *keytarget);
also als 2. Wert erwartet Deine Funktion einen Pointer auf int,
Du übergibst aber einen int (dwordval01) anstelle von &dwordval01
Das hat zwar nix mit Deinem Problem direkt zu tun,
aber was geben Dir denn die Reg*-Funktionen als Ergebnis zurück??
Gruß,
Colonius
-
okay, jetzt habe ich wenigstens einen eintrag in die registry...
thanx.
jetzt habe ich nur das problem, das der wert "ungültig" ist...
der wert sollte als REG_DWORD mit dem wert 9 gespeichert sein,
d.h. 0x00000009 (9)...wie kriege ich das hin?
-
Schau mal in die FAQ!
-
hab die FAQ mehrmals auf dieses problem durchsucht, aber nix gefunden...

-
Alsowenn dir der FAQ-Thread nicht geholfen hat könntest du mal versuchen, die Funktion direkt aufzurufen (also nicht in eine Funktion kapseln) - klappt es dann?
-
schon probiert, klappt aber leider nicht...
-
Also ohne die Rückgabewerte von RegCreateKey und RegSetValueEx zu überprüfen wirst Du da kaum den Fehler finden...
Des weiteren ist RegCreateKey veraltet (und nur noch wegen der 16-bit Kombatibilität drin), nimm lieber RegCreateKeyEx
-
also:
momentan arbeite ich noch mit RegCreateKey.
ich habe versucht, da einfach das "Ex" dranzuhängen, bekam dann aber einen compilerfehler nach dem anderen... ich glaube, die parameter sind bei RegCreateKeyEx etwas anders, und ich hatte schon genug mühe, irgendwas in die registry zu schreiben, bzw. zu kapieren wie ich das anstelle.zum problem:
wenn ich den wert "9" als REG_DWORD eintragen will, bekomme ich zwar einen eintrag, der aber von regedit als "ungültiger wert" angezeigt wird.
habe also den wert mal direkt in regedit eingetragen.
in hex ist das dann: "09 00 00 00"...
wenn ich das jetzt an meine reginsert-funktion weiterleite, bekomme ich aber den hex-wert "15f90"...
ich denke mal, ich habe einfach nicht kapiert, wie ich einen int-wert in einen DWORD-wert umrechne... (DWORD bedeutet DOUBLE, oder?)plz help!

-
sorry, das problem hat sich gelöst...
einfach ignorieren!
und big thx für die bisherige hilfe!!!

-
Nur Schade dass die leute dann nie posten WIE sich das problem dann schlussendlich gelöst hat. Wer das gleiche problem hat und hier sucht, der ist am ende gefrustet weil die lösung des problems 'hat sich erledigt, es funtzt' heißt

greets,
andi
-
stimmt leider, den genau jetzt hab ich dieses problem auch, ich benutz übrigens überall die Ex variante sofern möglich, bekomme aber bei im regedit "ungültiger wert" zurück geliefert.
teil 1, falls der schlüssel vorhanden ist
if (RegOpenKey(hkey,(LPTSTR) subkey, &hKey) == ERROR_SUCCESS) { DWORD dwError = RegQueryValue(hKey,(LPCTSTR) valuename, (LPTSTR) value,pl_size); if (hKey) RegCloseKey(hKey);teil 2, falls nicht
RegCreateKeyEx(HKEY_CLASSES_ROOT,(LPTSTR) subkey,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPTSTR) subkey,0,KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { DWORD dwError = RegSetValueEx(hKey,(LPCTSTR) valuename,NULL,typ,(BYTE*) value ,strlen((LPTSTR) value)); if (hKey) RegCloseKey(hKey); }hilfe ist immer willkommen
-
Was für ein Problem hast du? Wie sind deine ganzen anderen Variablen definiert?
-
der prototyp is so definiert:
WriteRegistry(HKEY hKey, LPVOID subkey, LPVOID valuename, LPVOID value, DWORD typ,int i_hKeyID);im aufruf sieht das dann folgender maßen aus:
test->WriteRegistry(HKEY_LOCAL_MACHINE, "SOFTWARE\\Deutsche Post AG\\test", "test1", "9", REG_DWORD, i_hKeyID);es funktionieren alle arten von REG_XY einträgen bis auf REG_DWORD , da liefert er mir (0ungültiger DWORD-Wert) zurück.
-
Du musst als Wert auch einen Pointer auf einen DWORD übergeben:
DWORD dwNumber=150; RegSetValueEx(hKey,"EintragsName",0,REG_DWORD,(BYTE*)&dwNumber,sizeof(DWORD));Bei deinem Prototyp sähe das dann so aus:
DWORD dwNumber = 9; test->WriteRegistry(HKEY_LOCAL_MACHINE, "SOFTWARE\\Deutsche Post AG\\test", "test1", &dwNumber, REG_DWORD, i_hKeyID);
-
jetzt sagt er mir:
Konvertierung des Parameters 4 von 'unsigned long *' in 'void *& ' nicht moeglich
das es nicht funktioniert liegt mit großer wahrscheinlichkeit daran, dass der prototyp weiterhin als LPVOID definiert ist, dies sollte aber nach möglichkeit auch so bleiben, da ich damit mehrere verschiedene arten von REG_XY-typen eintragen können sollte, wenn das so nicht realisierbar ist, muss ich wohl für dword eine extra funktion schreiben

-
Komisch - nach LPVOID sollte er normalerweise ohne Probleme casten. Versuch es mal so:
(LPVOID)&dwNumber
-
D:\RegistryTool\RegToolTester\RegToolTester.cpp(19) : error C2664: 'WriteRegistry' : Konvertierung des Parameters 4 von 'void *' in 'void *& ' nicht moeglich
grml ich schreib gleich ne extra funktion dafür
-
Warum will der immer void *&, du hast den Funktionsparameter doch als void * bzw. LPVOID deklariert

Was macht überhaupt deine Klasse und warum hast du nicht einfach die Parametersignatur der WinAPI-Funktion übernommen

-
so die lösung meiner probleme ist da. hier die lsg, das problem war unter anterem der letzte parameter im aufruf, die länge des inhaltes
zuerst:
DWORD dwError = RegSetValueEx(hKey,(LPCTSTR) valuename,NULL,typ,(BYTE*) value ,strlen((LPTSTR) value));lsg:
DWORD dwError = RegSetValueEx(hKey,(LPCTSTR) valuename,NULL,typ,(BYTE*) value ,sizeof(DWORD));