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 tun

    Also 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)


Anmelden zum Antworten