C++ Application unter Vista (Registry Zugriff)



  • Vielen Dank erstmal für eure zahl- und hilfreichen Antworten.

    Jochen Kalmbach schrieb:

    WIE hast Du es denn eingebunden?
    Du musst es als Resource einbinden...

    Ja, das war auch mein letzter Versuch den ich unternommen hatte, es als resource einzubinden. Leider hat das auch nicht funktioniert.
    Ich hatte dabei mein Manifest, danke fürs berichtigen dessen, und folgenden Code eingefügt unter Propertiers - "Compile-time directives" Box in den Resource includes

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "AppName.Manifest"
    

    Leider mußt ich auch feststellen, dass ich gar keine .rc2 Datei habe.
    Bei dem Projekt wurden alle Resourcen in ein extra Projekt ausgelagert.
    Aber selbst dort läßt sich keine .rc2 Datei finden.

    Aber ich werds erstmal mit dem berichtigtem Manifest probieren.

    Grüße,


  • Mod

    Hast Du eine externe Mainfest Datei, die wie das Programm heißt? Oder willst Du das Manifest einbetten.

    Wenn Du die EXE öffnest im Ressourcen-Editor. Ist das Manifest dann sichtbar?



  • Martin Richter schrieb:

    Hast Du eine externe Mainfest Datei, die wie das Programm heißt? Oder willst Du das Manifest einbetten.

    Wenn Du die EXE öffnest im Ressourcen-Editor. Ist das Manifest dann sichtbar?

    Hallo,
    Ich hatte bisher immer eine externe Manifestdatei die den Namen der Applikation hatte (AppName.exe.Manifest). Es war also nicht direkt im Code eingebettet.

    Grüße,

    *edit*
    Ich habs gerade mal, wie oben beschrieben, nur mit dem korrigiertem Manifest ausprobiert und ich erhalte immernoch keinen Zugriff auf den Registryzweig 😞



  • Kommt denn die UAC-Meldung beim Start?



  • Was sagt denn GetLastError eigentlich?



  • sri schrieb:

    Kommt denn die UAC-Meldung beim Start?

    Ja.

    Luckie schrieb:

    Was sagt denn GetLastError eigentlich?

    GetLastError() sagt mir das der Vorgang erfolgreich abgeschlossen wurde, was aber nicht sein kann, weil mir die Messagebox, in welcher dies angezeigt wird, gar nicht erst angezeigt werden würde, wenn die Funktion, welche den RegistryKey öffnet, TRUE zurückliefern würde.

    -> Die Funktion, welche einen RegistryKey öffnet, liefert FALSE zurück, daher wird mir eine Messagebox angezeigt, in welcher der Fehlercode als String von GetLastError() ausgegeben wird.



  • Na, dann vermute ich mal stark, dass Du ein Vista x64 hast und Deine Anwendung x86 ist...
    Dann lies mal:
    http://www.codeproject.com/KB/system/Reflection.aspx



  • Jochen Kalmbach schrieb:

    Na, dann vermute ich mal stark, dass Du ein Vista x64 hast und Deine Anwendung x86 ist...
    Dann lies mal:
    http://www.codeproject.com/KB/system/Reflection.aspx

    Also, ich weiß nicht, unter Computer -> Eigenschaften steht aber explizit das es sich um ein 32Bit Betriebssystem handelt 😕



  • Wie lautet denn der Code zum Öffnen des Schlüssels?



  • sri schrieb:

    Wie lautet denn der Code zum Öffnen des Schlüssels?

    if ( RegOpenKeyEx(
            kHKey,							// handle to an open key
            lpSubKey,							// address of subkey name
            0,									// reserved
            KEY_WRITE | KEY_READ,				// desired security access
            &m_HKey								// address of buffer for opened handle
            ) != ERROR_SUCCESS )
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    

    Nichts besonderes ... das ist die Standartregistryfunktion...



  • Und wie heißt der zu öffnende Key?



  • sri schrieb:

    Und wie heißt der zu öffnende Key?

    HKEY_LOCAL_MACHINE\software\company\Application\testkey1
    

    Hast du wohl eine Idee ?



  • Und der Schlüssel existiert auch wirklich? Was passiert, wenn Du anstatt RegOpenKeyEx einmal RegCreateKeyEx verwendest?



  • sri schrieb:

    Und der Schlüssel existiert auch wirklich? Was passiert, wenn Du anstatt RegOpenKeyEx einmal RegCreateKeyEx verwendest?

    Nein er existiert natürlich nicht ... weil, wenn ich den nichtmal öffnen kann, konnte ich ihn vorher auch nicht anlegen 😉
    Da liegt ja mein Problem, das ich gänzlich keinen Zugriff auf die Registry unter HKEY_LOCAL_MACHINE habe.

    Aber danke das du dir da solch einen Kopf drum machst 🙂



  • Wenn er nicht existiert, dann kann RegOpenKeyEx ihn natürlich auch nicht öffnen. Das ist auf allen Systemen so, nicht nur auf Vista und nicht nur bei HKLM. Wenn Du RegOpenKeyEx durch RegCreateKeyEx ersetzt, dann wird der Schlüssel erstellt (falls nicht vorhanden) bzw. geöffnet (falls vorhanden). Durch das beigelegte Manifest klappt dies dann auch mit HKLM.



  • sri schrieb:

    Wenn er nicht existiert, dann kann RegOpenKeyEx ihn natürlich auch nicht öffnen. Das ist auf allen Systemen so, nicht nur auf Vista und nicht nur bei HKLM. Wenn Du RegOpenKeyEx durch RegCreateKeyEx ersetzt, dann wird der Schlüssel erstellt (falls nicht vorhanden) bzw. geöffnet (falls vorhanden). Durch das beigelegte Manifest klappt dies dann auch mit HKLM.

    Danke, aber dessen bin ich mir bewußt.
    Ich habe in einer vorherigen Funktion bereits versucht ihn zu erstellen. Aber da er nicht da ist, weil das erstellen nicht klappte, kann er ihn nich öffnen. Aber mein Problem ist ja das ich prinzipiell keinen Zugriff auf den Key HKLM bekomme.



  • Und welchen Fehlercode gibt die Erstellfunktion zurück?



  • sri schrieb:

    Und welchen Fehlercode gibt die Erstellfunktion zurück?

    Das weiß ich nicht mehr, leider.
    Ich habe das Problem nun anders gelöst.
    Sollte dieses Problem erneut auftreten, werde ich wohl den Installer die Einträge machen lassen und dann aus dem Programm nur noch lesend Zugriff auf die Registry nehmen.

    Aber danke nochmal an alle fleißigen Poster für eure Ideen und Verbesserungen.

    Liebe Grüße,
    inva


Anmelden zum Antworten