Registry Tutorial
-
Seltsam - damit kann ich aber leider nichts anfangen. Vielleicht hat ja jemand anderes noch eine Idee

-
Liefert denn strlen(cString)+1 den Wert 11?
-
If the function fails, the return value is a nonzero error code defined in WINERROR.H. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.
Poste mal was diese Funktion daraufhin liefert.
MfG SideWinder
-
Hier scheint der Fehler zu sein:
BYTE cString[]="G:\\lol.txt"; cout<<strlen(cString)+1;aus irgendeinem Grund kann er die Länge cStrings nicht messen. Vielleicht weil es BYTE ist?
mit char klappt es jedenfals. Aber ist BYTE nicht nur eine andere Definition

-
Hallo,
nero-ex schrieb:
Aber ist BYTE nicht nur eine andere Definition
nein, ist es nicht, denn in WINDEF.H steht geschrieben
:typedef unsigned char BYTE;das "unsigned" macht den entscheidenden Unterschied. Verwende BYTE also nur dann, wenn die Daten wirklich als Bytes, und nicht als Zeichen des Zeichensatzes behandelt werden sollen. Meistens sagen dir die Funktions-Deklarationen, was du sinnvollerweise benutzen solltest, in diesem Falle für strlen:
size_t strlen( const char *string );und am besten hält man sich genau an die Typangaben, um Überraschungen zu vermeiden.
MfG
-
Ja aber was ist denn jetzt falsch, denn auch wenn ichs in ein char array ändere, funktioniert es nicht.
-
dann habe ich deine Aussage in deiner vorhergehenden Antwort:
nero-ex schrieb:
mit char klappt es jedenfals.
wohl falsch verstanden...
wie sieht denn jetzt dein aktueller Code aus? Ist das immer noch der von Seite 1 (nur jetzt hoffentlich mit char-Arrays).?
Also klappt jetzt nur noch der Registry-Zugriff nicht? Prüfe auch den Rückgabewert von RegSetValueEx, um den Fehler besser lokalisieren zu können.MfG
-
Der einzige Fehler scheint in der RegSetValueEx Funktion zu sein:
HKEY hKey; RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0); char cString[]="G:\\lol.txt"; RegSetValueEx(hKey,"sav-dat",0,REG_SZ,cString,strlen(cString)+1); RegCloseKey(hKey);
-
nero-ex schrieb:
Der einzige Fehler scheint in der RegSetValueEx Funktion zu sein:
Scheint?

Es gibt eine Möglichkeit, das herauszufinden. Windows SAGT einem sogar, wenn etwas schief läuft. Man muß es halt auswerten (was Du in dem Codestück dort nicht tust). Warum tust Du es nicht? Hat das einen Grund?
-
jetzt habe ich dein Problem erkannt, sorry, aber du hast mich wirklich verwirrt mit dem "jetzt funktioniert es mit char usw...". Du bekommst immer noch einen Fehler beim Kompilieren, denn das kann sich gar nicht kompilieren lassen, da RegSetValueEx einen BYTE-Zeiger erwartet, ein C++-Compiler wie der unter Dev-C++ aber sehr genau auf die Typen achtet (deshalb wohl auch dein Versuch mit BYTE cString[] usw...). Deswegen muß man die explizite Typ-Umwandlung durchführen, im folgenden mit reinterpret_cast:
HKEY hKey; RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,0); char cString[]="G:\\lol.txt"; RegSetValueEx(hKey,"sav-dat",0,REG_SZ,reinterpret_cast<BYTE*>(cString),strlen(cString)+1); RegCloseKey(hKey);nur schade, daß die genaue Fehlermeldung in der DevC++-IDE so "verschluckt" wird, denn mit der kompletten Meldung hätte man es gleich gesehen.
MfG
-
SUPER

Funzt endlich
Danke

-
Kann das vielleicht jemand im WinAPI FAQ ändern:
Wert-Funktionen
Werte erstellen:
C/C++ Code:
BYTE cString[]="Hallo, das ist der eigentliche Wert, der unter dem Namen EintragsName gespeicehrt wird";
RegSetValueEx(hKey,"EintragsName",0,REG_SZ,cString,strlen(cString)+1);
C/C++ Code:
BYTE cString[]="Hallo, das ist der eigentliche Wert, der unter dem Namen EintragsName gespeicehrt wird";
RegSetValueEx(hKey,"EintragsName",0,REG_SZ,cString,strlen(cString)+1);(BYTE ist als unsigned char definiert)
-
ich denke, jetzt ist noch eine kurze Erklärung fällig, warum der FAQ-Eintrag trotz deiner Probleme völlig korrekt ist:
das WinAPI ist eine reine C-Schnittstelle, und so ist es nicht ungewöhnlich, daß man WinAPI-Programme mit Hilfe eines C-Compilers schreibt (das Standard-Werk zur WinAPI-Programmierung von C.Petzold z.B. beschreibt die WinAPI-Programmierung mit C). Ein C-Compiler wiederum hat mit dem Code in den FAQ aber überhaupt keine Probleme, er wird anstandslos übersetzt! Also auch das von dir genannte Code-Stück:
BYTE cString[]="Hallo, das ist der eigentliche Wert, der unter dem Namen EintragsName gespeichert wird"; RegSetValueEx(hKey,"EintragsName",0,REG_SZ,cString,strlen(cString)+1);ist, als C-Code betrachtet, fehlerlos! (BYTE* wird hier bei Aufruf der Funktion strlen implizit in char* "gewandelt", in C ist das kein Problem).
Wenn ein C++-Compiler eingesetzt wird, muß man aber (u.a.) auch noch auf die Typen achten, manche Umwandlungen sind hier implizit nicht möglich, auch nicht die von "unsigned char*"(BYTE*) nach "char*", deshalb meine Anmerkungen oben:
ein C++-Compiler wie der unter Dev-C++ aber sehr genau auf die Typen achtet
und
das "unsigned" macht den entscheidenden Unterschied.
(für einen C++-Compiler
)also zusammengefaßt: es kann durchaus Code in den FAQ stehen, der so einwandfrei nur mit einem C-Compiler läuft. Wird ein C++-Compiler eingesetzt, sind evtl. geringfügige Änderungen nötig.
Ich hoffe, ich konnte die Sache etwas aufklären...
MfG
-
Ok, danke für die Information

Und danke für die Hilfe
