Registry - Warum kein Eintrag?



  • Hi,
    ich benutze flgende Funktion, sie wird korrekt compiliert, und alles, aber leider tritt nicht der gewünschte Effekt auf, nämlich ein Eintrag in der Windows Registry im Verzeichnis: "HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"

    Weiß jemand woran das liegt, liegen könnte?

    void autostart()
    {
    	HKEY hkey;
        HKEY KEY = HKEY_LOCAL_MACHINE;
        char place[]= "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
    	char name[]= "Testkey";
        char value[]= "D:\\test.bat";
    
    	RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
    	RegSetValueEx(hkey, (LPCWSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
    	RegCloseKey(hkey);
    }
    


  • Womöglich weil irgendwo auf dem Weg etwas schiefgegangen ist (keine Schreibrechte, Tipfehler beim Pfad, ...). Da ist es immer eine gute Idee, den Rückgabewert der aufgerufenen Funktionen auszuwerten (und notfalls per GetLastError() weitere Informationen zu den aufgetretenen Fehlern zu erfragen).

    Edit: Und ein mögliches Problem könnte die Umwandlung von char[] in wchar_t* (LPCWSTR) sein.



  • mach ma die casts (LPCTSTR) und (LPCWSTR) weg.



  • Hallo Die Eule,

    in der Win32 SDK Reference steht, dass das zweite Argument von RegSetValueEx vom Typ LPCTSTR (Pointer to a constant null-terminated Unicode or Windows character string) und nicht vom Typ LPCWSTR (Pointer to a constant null-terminated Unicode character string) ist.

    Tausch einfach die 11. Zeile mit dieser aus!

    RegSetValueEx(hkey, (LPCWSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
    

    Mit freundlichen Grüßen

    WilMen



  • WilMen schrieb:

    Tausch einfach die 11. Zeile mit dieser aus!

    RegSetValueEx(hkey, (LPCWSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
    

    Mit freundlichen Grüßen

    WilMen

    Hmmm ... ich will ja nichts sagen, aber das ist Zeichen für Zeichen ein und die selbe Zeile, wie in meinem Code ... 😞



  • Guckst Du, alles fertisch 😉 ➡ http://www.c-plusplus.net/forum/viewtopic-var-t-is-174557-and-highlight-is-*autostart*.html

    Dann noch:
    Die verwendeten Casts sind ziemlich riskant bezüglich des verwendeten Zeichensatzes, siehe auch CStoll's Post!

    Das:

    WilMen schrieb:

    Tausch einfach die 11. Zeile mit dieser aus!

    RegSetValueEx(hkey, (LPCWSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
    

    ist quatsch (sry^^).
    Ein LPCTSTR richtet sich nach dem aktuellen Zeichensatz, ist also eigentlich so, in diesem Fall, nicht besser. Das Problem ist hier, dass Du einen const char* ( ➡ "char name[]= "Testkey";") nach const wchar_t* ( ➡ "(LPCWSTR)name") castest. Das kann nur schief gehen 😃 . Verwende beim definieren der statischen C-Strings das Makro TEXT und den Datentyp TCHAR.



  • @CodeFinder

    Ja ich habe dummerweise beim Kopieren der 11. Zeile vergessen das Casting zu ändern, aber in dem davorgehenden Text habe ich es richtig geschrieben. So meinete ich es und so funktioniert es auch. :p

    RegSetValueEx(hkey, (LPCTSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
    

    MfG WilMen



  • nöö das ist doch schwachsinnig da einfach so rumzucasten ... wenn du UNICODE aktiviert hast steht da LPCWSTR und sonnst LPCSTR ..


Anmelden zum Antworten