RegSetValueEx speichert nur Datenmüll
-
Hallo,
will im meinem Programm einen funktion einbauen, damit sich die dateiendungen automatisch mit meinem programm öffnen. mein programm heisst "kstat" und hier ist der code:HKEY handle; RegCreateKeyEx(HKEY_CLASSES_ROOT, L".kst", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &handle, NULL); RegOpenKeyEx(HKEY_CLASSES_ROOT, L".kst", 0, KEY_ALL_ACCESS, &handle); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)"kstat", strlen("kstat"); RegCloseKey(handle);Er hat die die schlüssel alle erstellt und alles richtig, nur in HKEY_CLASSES_ROOT\.kst im default wert hat er statt "kstat" einfach irgendwie nur zwei solcher rechtecke rein, als ob es praktisch "datenmüll" ist. stimmt etwas an meiner denkweise im code nicht?
danke im voraus!
-
Ich denke, es liegt daran, dass du Unicode und ANSI vermischst - bei RegCreateKeyEx und RegOpenKeyEx hast du den Schlüssel in Unicode angegeben (lieber das TEXT-Makro verwenden), also scheinst du wohl UNICODE bzw. _UNICODE definiert zu haben. Bei RegSetValueEx hast du den String aber ganz normal angegeben - das funktioniert dann so natürlich nicht

-
danke. jetzt trägt er keinen datenmüll mehr ein, aber leider nur die ersten beiden zeichen

HKEY handle; RegCreateKeyEx(HKEY_CLASSES_ROOT, TEXT(".kst"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &handle, NULL); RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT(".kst"), 0, KEY_ALL_ACCESS, &handle); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)TEXT("KStat"), strlen("KStat")); RegCloseKey(handle);also nur "KS" wird dort eingetragen

-
strlen("KStat") funktioniert so nicht bei Unicode. Du musst ja die Anzahl an Bytes und nicht die Zeichenzahl übergeben - eher so irgendwie:
WCHAR szData = TEXT("KStat"); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)szData, sizeof(szData));Ist allerdings ungetestet (bin mir mit sizeof gerade nicht ganz sicher
)
-
flenders schrieb:
strlen("KStat") funktioniert so nicht bei Unicode. Du musst ja die Anzahl an Bytes und nicht die Zeichenzahl übergeben - eher so irgendwie:
WCHAR szData = TEXT("KStat"); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)szData, sizeof(szData));Ist allerdings ungetestet (bin mir mit sizeof gerade nicht ganz sicher
)Müsste ein PWCHAR sein und da funktioniert sizeof natürlich nicht (ergäbe 4).
Hier mal die Nur-Unicode-Variante, daher auch keine TEXT-Makro, da es ohne Unicode sowieso nicht kompilieren würde. Will man es kompatibel mit beiden Zeichensätzen machen, müsste man den Typ TCHAR verwenden und bei der Bufferlängenberechnung dann eben zwischen beiden Fällen unterscheiden.
wchar_t *str = L"KStat"; size_t bufsize = ( wcslen(str)+1 ) * sizeof(wchar_t); HKEY handle; RegCreateKeyEx(HKEY_CLASSES_ROOT, L".kst", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &handle, NULL); RegOpenKeyEx(HKEY_CLASSES_ROOT, L".kst", 0, KEY_ALL_ACCESS, &handle); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)str, bufsize); RegCloseKey(handle);
-
Sorry, hatte da einen Denkfehler gemacht - aber so sollte es auch klappen:
TCHAR szData[] = TEXT("KStat"); RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)szData, sizeof(szData));
-
danke für die vielen antworten. ich habe gestern noch etwas herumexperementiert und habe es so hinbekommen:
RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)TEXT("KStat"), (strlen("KStat")*2));Ist das jetzt zufallen, dass er "KStat" komplett reinschreibt oder wird es nicht funktionieren, wenn mal irgendein wort kommt wie "KStatGeneratorProgrammWeissIchWas"? kann mir meine logik mit dem strlen()*2 nicht ganz erklären :p
-
ulli82 schrieb:
danke für die vielen antworten. ich habe gestern noch etwas herumexperementiert und habe es so hinbekommen:
RegSetValueEx(handle, NULL, 0, REG_SZ, (BYTE *)TEXT("KStat"), (strlen("KStat")*2));Ist das jetzt zufallen, dass er "KStat" komplett reinschreibt oder wird es nicht funktionieren, wenn mal irgendein wort kommt wie "KStatGeneratorProgrammWeissIchWas"? kann mir meine logik mit dem strlen()*2 nicht ganz erklären :p
Unicode-Zeichen sind ja 16 bit breit und dein Stringliteral, das du strlen übergibst, ist ein 8Bit-String. Die Tatsache, dass es ohne Einbeziehung der Nullterminierung funktioniert ist wohl eher zufällig, laut MSDN erwartet diese Funktion jedenfalls einen nullterminierten Buffer.
strlen(TEXT("KStat")) würde unter Unicode jedenfalls nicht funktionieren.
Mach es einfach so, wie es Flenders geschrieben hat, das kompiliert dann mit und ohne Unicode. Es ist außerdem unschön, die Stringliterale mehrfach direkt in die Funktionsaufrufe zu schreiben.