Registry



  • Also ich wollte iegentlich nur mal eben einen Autostart einrivhten und dass ging eigentlich bisher auch immer aber irgendwas mache ich anscheinend grade falsch.

    char pfadname[500];
    HKEY hKey;
    GetModuleFileName(NULL, pfadname, 500);
    RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",&hKey);
    RegSetValueEx(hKey,"Test1",0,REG_SZ,pfadname,strlen(pfadname)+1);
    RegCloseKey(hKey);
    

    Was stimmt daran nicht?Eigentlich sollte doch dann einfach der Pfad meines Programmes geschreiben werden oder????

    Thx



  • Ich habe jetzt, da die Fehlermeldung sich über die char(die kein byte war 😉 ) beschwert hat, so abgeändert:

    byte pfadname[500];
    HKEY hKey;
    GetModuleFileName(NULL, (char*)pfadname, 500);
    RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",&hKey);
    RegSetValueEx(hKey,"Test1",0,REG_SZ,pfadname,strlen((char*)pfadname)+1);
    RegCloseKey(hKey);
    

    Jetzt gibt es auch keinen Fehler mehr!!!!....
    Aber leider wird der Wert trotzdem nicht erstellt 😞 .

    Woran kann das liegen?



  • Casten sollte man immer vermeiden, wenn man nicht weis was man tut!
    Entweder: Übersetze Dein Projekt mit "Multi-byte Character-Set" (Projekteinstellungen|General) oder verwende die TCHAR-Typen... z.B.:

    TCHAR szPfadName[1024];
    GetModuleFileName(NULL, szPfadName, 1024);
    

    Und natürlich die Rückgabewerte prüfen...



  • Ich benutze Multybyte. ABer ohen den casst gibt es einen Compilerfehler



  • Dann änder "byte" nach "char" oder nimm einfach meinen Code...
    PS: Leider muss man bei "RegSetValueEx" casten... da man bei diese Funktion verschiedene Datentypen übergeben kann...
    PPS: Auch solltest Du *alle* Rückgabewerte prüfen, ob ein Fehler auftrat!



  • Hmm... Kannst du vllt mein Codebeispiel nochmal richtig posten? Ich weiß jetzt nciht genau in was ich das jetzt casten soll und von welchem Typ die variable sein soll. Danke



  • Ich verstehe nicht, was an dem Beispiel in der Hilfe unverständlich ist:
    http://msdn2.microsoft.com/en-us/library/aa363634(VS.85).aspx



  • void CreateRegistryEntry (char *lpEntryName,
                              char *lpEntryOption = NULL,
                              char *lpEntryValue = NULL,
                              HKEY hKey = HKEY_LOCAL_MACHINE,
                              char *lpRegistryPath = NULL)
    {
        HKEY hk;
    
        char szBuffer[MAX_PATH + 2];
        char szResult[MAX_PATH + 5 + sizeof (lpEntryOption)];
        GetModuleFileName (NULL, szBuffer, MAX_PATH);
    
        if (lpRegistryPath == NULL)
            RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
        else
            RegCreateKey (hKey, lpRegistryPath, &hk);
    
        if (lpEntryValue == NULL)
        {
            if (lpEntryOption == NULL)
                lstrcpy (szResult, szBuffer);
            else
                wsprintf (szResult, "\"%s\" %s", szBuffer, lpEntryOption);
    
            RegSetValueEx (hk, lpEntryName, 0, REG_SZ, szResult, strlen (szResult));
        }
        else
            RegSetValueEx (hk, lpEntryName, 0, REG_SZ, lpEntryValue, strlen (lpEntryValue));
    
        RegCloseKey (hk);
    }
    
    void DeleteRegistryEntry (char *lpEntryName,
                              HKEY hKey = HKEY_LOCAL_MACHINE,
                              char *lpRegistryPath = NULL)
    {
        HKEY hk;
    
        if (lpRegistryPath == NULL)
            RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
        else
            RegCreateKey (hKey, lpRegistryPath, &hk);
    
        RegDeleteValue (hk, lpEntryName);
    
        RegCloseKey (hk);
    }
    
    bool PeruseRegistryEntry (char *lpEntryName,
                              HKEY hKey = HKEY_LOCAL_MACHINE,
                              char *lpRegistryPath = NULL)
    {
        HKEY hk;
        bool bReturn = false;
    
        if (lpRegistryPath == NULL)
            RegCreateKey (hKey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", &hk);
        else
            RegCreateKey (hKey, lpRegistryPath, &hk);
    
        if (RegQueryValueEx (hk, lpEntryName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
            bReturn = true;
        else
            bReturn = false;
    
        RegCloseKey (hk);
    
        return bReturn;
    }
    

    sind mal drei funktionen...also man kann entweder direkt autostart einträge damit erstellen, oder auch sonst welche eben je nach parameter übergabe...
    als beispiel für autostart-einträge:

    //Autostart-Eintrag erstellen
    CreateRegistryEntry ("Autostart");
    //Autostart-Eintrag löschen
    DeleteRegistryEntry ("Autostart");
    //Überprüfen ob Autostart-Eintrag vorhanden ist
    PeruseRegistryEntry ("Autostart");
    

Anmelden zum Antworten