Wie speichere ich Daten in die Windows-Registry?
-
hi!
Ich bin noch ein blutiger Anfänger und kenn mich noch nicht so aus.
Ich möchte Daten zum initialisieren meines Programms in die Registry speichern.Der folgende Code hat einmal zumindest das Verzeichnis Software\\Unternehmen\\MyApp angelegt.
Leider ist nur der Wert "Standard" drinnen, ohne gesetzten Wert...
Aber wieso??void StoreRegistry(char *szCom, int baudrate){ HKEY hkey; DWORD dwDisposition; DWORD dwType, dwSize; char szBuffer[6]="COM1"; if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Unternehmen\\MyApp"), 0, NULL, 0, 0, NULL, &hkey, &dwDisposition)== ERROR_SUCCESS) { dwType = REG_DWORD; dwSize = sizeof(DWORD); RegSetValueEx(hkey, TEXT("Port"), 0, dwType, (PBYTE)&szBuffer, dwSize); RegCloseKey(hkey); }
-
Weil du bei samDesired nur 0 angegeben hast
- schau mal in die FAQ, da gibts imho dazu was
-
danke, jetzt funktioniert es...
Nur beim Auslesen bekomme ich eine Error-Meldung:
D:\MOBYTERM\MOBYTERM.cpp(679) : error C2440: '=' : 'const int' kann nicht in 'unsigned long *' konvertiert werden
Dies bezieht sich auf dwType = REG_SZ
Warum geht das hier nicht und beim obrigen Beispiel schon?Hier ist mein Dummy-Code:
void GetFromRegistry() { DWORD lpcbData; LPDWORD dwType; HKEY hKey; LPBYTE lpData; if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Siemens\\MobyTerm\\rs232settings"), 0, KEY_READ,&hKey)==ERROR_SUCCESS) { dwType = REG_SZ; for (;;) { lpcbData = 10; // reinitialize every time if(!RegQueryValueExA(hKey,"ComPort", 0, dwType, lpData, lpcbData) == ERROR_SUCCESS) { MessageBox(hWnd,"Error retrieving Data from Registry","",MB_OK); } else MessageBox(hWnd,"Seems to have received Data from Registry","",MB_OK); }
-
und wenn ich REG_SZ explizit caste, bekomme ich zwar beim Kompilieren keine Fehler mehr, jedoch dafür dann beim Ausführen eine unbehandelte Ausnahme mit Access Violation´:
RegQueryValueExA(hKey,"comport", 0,(LPDWORD) REG_SZ, lpData, &lpcbData)
-
Wie mir scheint, hast du dir den FAQ-Beitrag noch nicht angeschaut
-mach das mal
Dann wüsstest du nämlich, dass du dir natürlich erst Speicher für den Buffer besorgen musst
-
Ja, du hasttest, recht, den hätte ich mir gleich anschauen sollen
Jetzt funktioniert auch alles , wie ich es will, bis auf eins:
Bei Zahlen geht das alles ohne Probleme, nur habe ich einen String, den ich erfolgreich in die Registry schreibe.
Wenn ich ihn abfrage, bekomme ich ihn auch. Mit einer MessageBox kann ich hn anzeigen.
Will ich ihn aber in einen Strukt mit vordefiniertem Wert char *comport setzen, funktionierts anscheinend nicht.
Das sicher etwas mit diesem Pointer zu tunAlso das ganze anschaulich hier nochmal:
Der Struct:
struct t_rs232settings { char *comport; unsigned long baudrate; int parity; int databits; int stopbits; int timeout; };
und meine Funktion:
void load_rs232_settings() { HKEY hKey; BYTE* lpData; DWORD dwType, dwSize; //rs232_settings Variables: char *szComPort; DWORD baudrate; DWORD parity; DWORD databits; DWORD stopbits; DWORD timeout; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Siemens\\MobyTerm\\rs232settings"), 0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS) { /* ************************************************************************* */ if(RegQueryValueExA(hKey,"comport", NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS) { //Reading dwSize for initializing lpData-Pointer lpData = (BYTE*)malloc(dwSize); //for strings... //Reading Data into buffer lpData if(RegQueryValueExA(hKey,"comport", NULL, &dwType, lpData, &dwSize) == ERROR_SUCCESS) { szComPort = new char[dwSize]; sprintf(szComPort,"String: %s",lpData); } // Free memory of lpData-Pointer free(lpData); } else MessageBox(hWnd,"Error receiving ComPort-Data","",MB_OK | MB_ICONWARNING); // restliche Zahlen-Werte aus Registry holen... [...] //initialisieren: rs232settings.baudrate = baudrate; rs232settings.comport = szComPort; rs232settings.databits = databits; rs232settings.stopbits = stopbits; rs232settings.parity = parity; rs232settings.timeout = timeout; RegCloseKey(hKey); }
Ersetze ich
rs232settings.comport = szComPort;
mit
rs232settings.comport = "COM1";
funktioniert es wieder...
Ich habs auch mit explizitem umcasten versucht, aber da hab ich nur Fehlermeldungen bekommen...
-
Wenn ich das richtig sehe hast du nach dem sprintf in szComPort ja auch "String: COM1" und nicht "COM1" drinstehen
bzw. dein szComPort Buffer ist dann ja auch gar nicht mehr groß genug -> es steht wohl nur noch "Stri" o.ä. drin
-
Sorry, ich hatte den benutzername vergessen und deswegen wurde mein letztes Posting garnichtmehr gepostet
Ja, du hast recht, danke für die prompten Tips...
Mein letztes Posting hätte folgendes sein sollen :
Hat sich schon erübrigt, sorry, war ein Blödsinn meine letzten Vermutungen...
Der Fehler war:
sprintf(szComPort,"String: %s",lpData);
Sonst wusste ich nicht, wie ich diesen Pointer lpData in einen vernünftigen String kriege ausser mit sprintf....
(Die machen mich noch total verwirrt diese Pointer)