USHORT-Wert in Registry schreiben
-
Ich habe ein Problem mit dem Schreiben von Zahlenwerten in die Registry. Ich beziehe mich dabei auf den Beitrag http://www.c-plusplus.net/forum/viewtopic-var-t-is-39373.html
Wenn ich jetztl_ErrCde=RegSetValueEx(hKey,"ptAIConfig_LVDT_links.DasChan",0,REG_DWORD,(BYTE*)&ptAIConfig_LVDT_links.DasChan,sizeof(DWORD)); if (l_ErrCde!=ERROR_SUCCESS) { AfxMessageBox("Fehler beim Schreiben in die Registry!",MB_OK |MB_ICONEXCLAMATION); Error=true; } l_ErrCde=RegSetValueEx(hKey,"ptAIConfig_LVDT_links.DasGain",0,REG_DWORD,(BYTE*)&ptAIConfig_LVDT_links.DasGain,sizeof(DWORD)); if (l_ErrCde!=ERROR_SUCCESS) { AfxMessageBox("Fehler beim Schreiben in die Registry!",MB_OK |MB_ICONEXCLAMATION); Error=true; }schreiben will, dann wird nur der erste Wert korrekt eingetragen. Der zweite Eintrag wird zwar auch angelegt, hat aber immer den Wert 65536. Die Datenstruktur ist so definiert:
typedef struct tagPT_AIConfig { USHORT DasChan; USHORT DasGain; } PT_AIConfig, FAR * LPT_AIConfig;Was mach ich da falsch? Diese Daten kommen aus dem Treiber einer Messkarte, an der noch zwei weitere Sensoren angeschlossen sind. Insgesamt will ich also 6 Werte in die Registry schreiben, bei denen immer nur die ersten richtig übertragen werden.
-
Du musst schon einen Zeiger auf ein DWORD übergeben (DWORD: 4 Byte, USHORT: 2 Byte).
Versuchs mal so:DWORD dw = ptAIConfig_LVDT_links.DasChan; l_ErrCde=RegSetValueEx(hKey,"ptAIConfig_LVDT_links.DasChan",0,REG_DWORD,(BYTE*)(&dw),sizeof(DWORD)); if (l_ErrCde!=ERROR_SUCCESS) { AfxMessageBox("Fehler beim Schreiben in die Registry!",MB_OK |MB_ICONEXCLAMATION); Error=true; } dw = ptAIConfig_LVDT_links.DasGain; l_ErrCde=RegSetValueEx(hKey,"ptAIConfig_LVDT_links.DasGain",0,REG_DWORD,(BYTE*)(&dw),sizeof(DWORD)); if (l_ErrCde!=ERROR_SUCCESS) { AfxMessageBox("Fehler beim Schreiben in die Registry!",MB_OK |MB_ICONEXCLAMATION); Error=true; }
-
hustbaer schrieb:
Du musst schon einen Zeiger auf ein DWORD übergeben (DWORD: 4 Byte, USHORT: 2 Byte).
Das ist mir schon klar. Aber warum funktionierts immer beim Schreiben des Parameters DasChan und beim Schreiben des Parameters DasGain kommt so eine utopisch große Zahl raus. Die Werte für die einzelnen Variablen bewegen sich in einem Bereich zwischen 0 und 15.
-
Vermutlich weil du etwas mehr Daten schreibst als eigentlich beabsichtigt - die beiden USHORT-Werte sind je 2 Byte groß, du schreibst je 4 Byte, da müssen die übrigen 2 Byte irgendwo herkommen. Hast du mal Hustbaer's Variante ausprobiert?
-
CStoll schrieb:
Vermutlich weil du etwas mehr Daten schreibst als eigentlich beabsichtigt - die beiden USHORT-Werte sind je 2 Byte groß, du schreibst je 4 Byte, da müssen die übrigen 2 Byte irgendwo herkommen. Hast du mal Hustbaer's Variante ausprobiert?
Versteh ich trotzdem nicht ganz. In einem Fall ist
ptAIConfig_LVDT_links.DasChan=0; ptAIConfig_LVDT_links.DasGain=0;DasChan wird richtig übertragen, DasGain nicht. Ich hab das jetzt so umgestellt:
DWORD LVDT_links_Config_DasChan=(DWORD)ptAIConfig_LVDT_links.DasChan; DWORD LVDT_links_Config_DasGain=(DWORD)ptAIConfig_LVDT_links.DasGain;und das geht auch.
-
Wie gesagt, irgnendwo müssen die beiden zusätzlichen Bytes herkommen. Um dir das mal zu verdeutlichen, der ungefähre Aufbau des Speichers:
| 0 | 1 | 2 | 3 | 4 | 5 | | Chan | Gain | XXXXX | erster Set: | ............. | zweiter Set: | ............. |Im ersten Anlauf erwischst du außer den Chan-Daten auch den Gain-Anteil deiner struct (ist nicht weiter auffällig, weil du nur Nullen hast - wenn du dort etwas anderes einträgst, siehst du den Unterschied), im zweiten Anlauf erwischst du den Gain-Anteil und den Inhalt der nächsten Variablen, die hinter dem struct steht - das ist aus deiner Sicht Müll.
Bei der Alternativlösung - umkopieren in eine DWORD-Variable - hast du dagegen einen 4-Byte-Wert (die höherwertigen Anteile werden mit 0 aufgefüllt) und damit definiert die richtigen Daten).
-
Danke für die Erklärung, jetzt hab ich das verstanden.