Registry-Eintrag
-
Ich habe ein Problem mit dem eintragen von Werten in die Registry.
Ich habe mir aus dem FAQ folgende zeilen zu gemüte geführt:
HKEY hKey; RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\PROJEKTARBEIT",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0); BYTE cString[]= "test"; RegSetValueEx(hKey,"Gerät1",0,REG_SZ,cString,20);
Mein Problem ist folgendes. Wie kann ich eine Variable (oder besser welche) von einem EDIT-Feld dort eintragen.
Probiert hab ichs so:
//BYTE cString[]= "test"; RegSetValueEx(hKey,"Gerät1",0,REG_SZ,VARIABLE,20);
Aber egal was ich anstelle von BYTE, CString, char, uws. Jedesmal kann er etwas nicht konvertieren oder C++ ist alles fürn AR...... .
Kann mir da bitte einer helfen !!!
THX
-
Schreib mal lieber die Fehlermeldungen hin, wo er was nicht konvertieren kann.
-
Also... Wenn ich die Variable m_Name1 als BYTE deklariere m_DevicesDlg.m_Name1)
RegSetValueEx(hKey,"Gerät1",0,REG_SZ,RegSetValueEx(hKey,"Gerät1",0,REG_SZ,cString,20);
Kommt diese Fehlermeldung:
[b]error C2664: 'RegSetValueExA' Konvertierung des Parameter 5 von 'BYTE' in 'const BYTE *' nich möglich
-
heißt dann natürlich:
RegSetValueEx(hKey,"Gerät1",0,REG_SZ,m_DevicesDlg.m_Name1,20);
Blödes KOPY/PASTE
-
BYTE ist ein einzelnes Zeichen, du benötigst BYTE* (Pointer auf Zeichen(array)) oder BYTE[] (Zeichenarray).
-
Da musst du wohl casten.
Ich kopier dir mal, wie ich das hingekriegt habe.
RegSetValueEx(hKey, f_strName, 0, REG_SZ, reinterpret_cast<LPBYTE>(f_strWert.GetBuffer(f_strWert.GetLength()+1)),f_strWert.GetLength()+1);
f_strName ist der Name des Schlüssels und f_strWert das, was du reinschreiben willst, beide sind CStrings.
Ich hoffe du kriegst es übertragen.
-
Also wenn ich das mit reinterpret_cast .... kompiliere, kommt keine Fehlermeldung. Allerdings wenn ich dann die Anwendung ausführe, dann kommt eine Nette Fehlermeldung:
DEBUG ASSERTION FAILED!
gibt es noch einen anderen Weg, wie ich das problem lösen kann ?
-
Uruk-h4j schrieb:
Also wenn ich das mit reinterpret_cast .... kompiliere, kommt keine Fehlermeldung. Allerdings wenn ich dann die Anwendung ausführe, dann kommt eine Nette Fehlermeldung:
DEBUG ASSERTION FAILED!
Das ist keine Fehlermeldung...
Lies mal: http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html
-
Hast du dir denn das mal angeschaut?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/eventlog/base/adding_a_source_to_the_registry.asp
da gibt es alle möglichen Beispiele.Und wenn du REG_SZ nutzt, musst du soweit ich weiß auch string als Datentyp benutzen.
-
Wenn ich das EDIT-Feld mit einer CString Variable deklariere, sagt mir der Kompiler:
C2664: 'RegSetValueExA' Konvertierung des Parameters 5 con 'CString *_64' in 'const BYTEE *' nicht möglich....
und dann schreibt er das ich das ding mit dem 'reinterpreter_cast...' durchführen soll.
-
hast du denn dann einen reinterprete_cast versucht?
-
Korrekt ist IMHO:
CString szTest; szTest = _T("Hallo Welt!"); RegSetValueEx(k, _T("KeyName"), 0, REG_SZ, (CONST BYTE*)(LPCTSTR) szTest, (szTest.GetLength()+1)*sizeof(TCHAR));
@estartu: 1. Du erzeugst ein Speicherleck; 2. es ist nicht Unicode-fähig (was bei VC2005 standard ist)
-
Hast Du es mal so versucht?
RegSetValueEx(hKey,"Gerät1",0,REG_SZ,(LPCTSTR)m_DevicesDlg.m_Name1,m_DevicesDlg.m_Name1.GetLength());
Gruß
-
Jochen Kalmbach schrieb:
Korrekt ist IMHO:
CString szTest; szTest = _T("Hallo Welt!"); RegSetValueEx(k, _T("KeyName"), 0, REG_SZ, (CONST BYTE*)(LPCTSTR) szTest, (szTest.GetLength()+1)*sizeof(TCHAR));
@estartu: 1. Du erzeugst ein Speicherleck; 2. es ist nicht Unicode-fähig (was bei VC2005 standard ist)
Das kommt davon, wenn man da nicht durchblickt und sich nur freut, dass ne Fremdlösung zu laufen scheint.
Ich versuche mal so, wie du gezeigt hast.
-
@CTecS: Ja...
1. Compiler-Fehler:cannot convert parameter 5 from 'ATL::CSimpleStringT<BaseType>::PCXSTR' to 'const BYTE *'
2. Geht mit VC2005 per default gar nicht (nicht Unicode-fähig)
-
Ich habe das von Jochen jetzt übernommen und es funktioniert.
Sieht sogar einfacher aus als das was ich vorher hatte.
-
Ich habs jetzt mal mit der Version von Jochen versucht
CString szTest; szTest = _T("Hallo Welt!"); RegSetValueEx(k, _T("KeyName"), 0, REG_SZ, (CONST BYTE*)(LPCTSTR) szTest, (szTest.GetLength()+1)*sizeof(TCHAR));
Halt nur jetzt mit den Membervariablen. Und es funktioneiert FAST einwandfrei. Ich bekomm jetzt nur noch einen Ausnahmefehler von windows, wenn ich das Programm beende, aber das ist irgendwas anders.
Danke an alle !!!