[solved] Kann Name und Wert nicht in Registry Speicher[C++]



  • Hallo liebe C++ler,
    da dies mein erster Forumeintrag ist, möcht ich erstmal sagen, dass die Forum schon bei vielen allgemeinen Fragen geholfen hat. Aber diesmal geht es um eine spezielle Frage, in Bezug auf die Registry.
    In einem Projekt für die Schule versuche ich gerade ein Verschlüsselungsprogramm zu schreiben, welches Dateien einlesen, verschlüsseln und unter "Dateiname".cry wieder abgespeichert werden soll. Nun da eine veränderte Endung vorliegt, wäre es auch sehr praktisch, dass Proramm mit Doppelklick auf die Datei zu starten und die Entschlüsselung zu starten. Nun habe ich in einem ersten Versuch versucht Werte unter einem schon vorhandenen Schlüssel zu speichern. Nun meine Problem ist, dass ich zwar die Funktionen gefunden, korrekt integriet habe (mit #include <windows.h> und Advapi32.lib und Advapi.dll verknüpft, so wie es msdn sagt) und es auch problemlos kompiliert. Trotzdem wird der Wert nicht eingetragen.

    HKEY hkey;
      HKEY KEY = HKEY_LOCAL_MACHINE;
      char place[100]= {"Software\\Microsoft\\Windows\\CurrentVersion\\EventForwarding"};
      char name[100]= {"Autostart"};
      char value[100]= {"C:\\programm.exe"};
    
      RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey); 
      RegSetValueEx(hkey, (LPCTSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value));
      RegCloseKey(hkey); 
      this->textBox_registry->Text="Fertig!";
    

    Wie ihr seht, soll der Name "Autostart" und der Wert "C:\\programm.exe" unter HKLM:Software/Microsoft/Windows/CurrentVersion/Eventforwarding gespeichert werden (BEISPIELHAFT).

    Bitte Bitte, habt ihr vorschläge, wie ich das hinkriegen kann, dass es den Namen und den Wert einträgt?



  • Erste Frage bei Programmen mit char und TCHAR direkt nebeneinander: Hast du das als ANSI oder UNICODE übersetzt?

    Zweitens: Es wäre eine gute Idee, die Rückgabewerte der aufgerufenen Funktionen auszuwerten, um zu sehen was falsch gelaufen ist.



  • Erste Frage bei Programmen mit char und TCHAR direkt nebeneinander: Hast du das als ANSI oder UNICODE übersetzt?

    Unicode

    Zweitens: Es wäre eine gute Idee, die Rückgabewerte der aufgerufenen Funktionen auszuwerten, um zu sehen was falsch gelaufen ist.

    Wie stelle ich das am Vesten an?



  • rnng schrieb:

    Erste Frage bei Programmen mit char und TCHAR direkt nebeneinander: Hast du das als ANSI oder UNICODE übersetzt?

    Unicode

    Volltreffer 😃

    Du solltest dich eventuell mal mit dem Unterschied zwischen den beiden Formaten beschäftigen oder konsequent die TCHAR-basierten typedefs und Hilfsmakros verwenden:

    TCHAR place[] = _T("Software\\...");
    

    Zweitens: Es wäre eine gute Idee, die Rückgabewerte der aufgerufenen Funktionen auszuwerten, um zu sehen was falsch gelaufen ist.

    Wie stelle ich das am Vesten an?

    z.B. so:

    if( RegOpenKeyEx(...) != EXIT_SUCCESS )
    {
      // OpenKey ist schiefgelaufen
    }
    


  • Ok, Kommentar zur Kenntniss genommen und korrigiert.
    Nun schauts wie folgt aus:

    HKEY hkey;
      HKEY KEY = HKEY_LOCAL_MACHINE;
      TCHAR place[]= _T("Software\\Microsoft\\Windows\\CurrentVersion\\EventForwarding");
      TCHAR name[100]= _T("Autostart");
      char value[100]= {"C:\\programm.exe"};
    
      if (RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey) == EXIT_SUCCESS) 
      {
    	  if (RegSetValueEx(hkey, (LPCTSTR)name, 0, REG_SZ, (BYTE *)value, strlen(value)) == EXIT_SUCCESS)
    	  {
    			this->textBox_registry->Text="Fertig!";
    	  }
    	  else 
    	  {
    		  this->textBox_registry->Text="Fehler beim Eintragen!";
    	  }
      }
      else 
      {
    	  this->textBox_registry->Text="Fehler beim öffnen!";
      }
      RegCloseKey(hkey);
    

    Wow, es funktioniert, allerdings nur wenn man es als Administrator ausführt. Gibt es eine Möglichkeit, sich für diese Aktion Admin Rechte zu "besorgen"?



  • Verwende bitte "TCHAR" und kein "char"!
    Oder verwende "RegSetValueExA" anstelle von "RegSetValueEx"!

    Und Admin-Rechte bekommst Du, wenn Du Deiner Applikation ein "requireAdministrator" Manifest gibst.
    Und werte bitte die Fehler mit "GetLastError" aus; dann siehst Du auch den Grund warum es schiefgeht...



  • HKEY hkey;
      HKEY KEY = HKEY_LOCAL_MACHINE;
      TCHAR place[]= _T("Software\\Microsoft\\Windows\\CurrentVersion\\EventForwarding");
      TCHAR name[100]= _T("Autostart");
      TCHAR value[]= _T("C:\\programm.exe");
    
      if (RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey) == EXIT_SUCCESS) 
      {
    	  if (RegSetValueEx(hkey, (LPCTSTR)name, 0, REG_SZ, (BYTE *)value, sizeof(value)) == EXIT_SUCCESS)
    	  {
    			this->textBox_registry->Text="Fertig!";
    	  }
    	  else 
    	  {
    		  this->textBox_registry->Text="Fehler beim Eintragen!";
    	  }
      }
      else 
      {
    	  this->textBox_registry->Text="Fehler beim öffnen!";
      }
      RegCloseKey(hkey);
    

    Entschuldige Bitte, den Schnibsel hab ich übersehen. Jetzt ist nur nch TCHAR übrig.
    Aber es gilt weiterhin meine Frage: ist es möglich, sich Administrator Berechtigungen einzuforden?



  • Hab ich doch geschrieben: Dein Prozess braucht ein requireAdministrator Manifest. Siehe in den Projekteinstellungen von VS2010:
    C/C++|Linker|Manifest File|UAC Execution Level: requireAdministrator

    PS: Und warum postet Du dies unter C++/CLI?



  • Ich schreibe jetzt mal als Gast...
    Entschuldige bitte, dass ich den letzten Abschnitt übersehen habe. Ich werde mal morgen die MSDN befragen, was es dazu gibt. Vielen Dank an alle, die geholfen haben.
    [topic solved]


Anmelden zum Antworten