C++ Application unter Vista (Registry Zugriff)
-
inva schrieb:
Nun mußte ich aber bei einem Blick in den SOFTWARE Zweig des HKEY_LOCAL_MACHINE Root-Keys feststellen, dass andere Anwendungen wie z.B. der Adobe, der VMWare Inc. oder JavaSoft es gelungen war einen Eintrag dort zu erstellen.
Wenn man es richtig macht, geht es auch.

Wie viel Bit hat dein Programm und wie viel Bit dein Vista?
-
Luckie schrieb:
Wenn man es richtig macht, geht es auch.

Wie viel Bit hat dein Programm und wie viel Bit dein Vista?
Mein Vista hat 32 Bit, und da das Programm schon etwas älter ist, ich es aber leider nicht mit implementiert habe, sondern es hauptsächlich nur flott für Vista machen muss, würde ich mal vermuten das es sich hierbei auch um ein 32Bit-Programm handelt. Zwar hat das ja nicht zwingend was mit dem Alter zu tun, aber da wohl ein "Standartprojekt" und ne "Standartimplementierung" war würde ich auf 32Bit tippen. Mir wäre auch leider nicht bewußt wo ich das nachschauen könnte.
*edit*
Es handelt sich sicher um eine 32Bit Anwendung
Nunja, ich glaube ja das ich alles richtig gemacht habe, nur weiß ich eben, dass mir die Vista ristriktionen im Weg stehen.
-
Du brauchst Admin Rechte, dann kannst Du da schreiben (also "requireAdministrator" im Vista Manifest angeben).
Oder Du lässt Deinen Installer diese Einträge machen.
-
Jochen Kalmbach schrieb:
Du brauchst Admin Rechte, dann kannst Du da schreiben (also "requireAdministrator" im Vista Manifest angeben).
Oder Du lässt Deinen Installer diese Einträge machen.
Wie gesagt, dessen bin ich mir bewußt und habe auch bereits ein Manifest angefertigt, was eigentlich genau dies implementiert, aber jedoch funktioniert es mit dem Manifest genauso wenig. Wie gesagt, verwende ich Visual Studio 6 und kanns auch nicht nach Visual Studio 2005 portieren.
Das es im 2005er Studio eine Einstellung dafür gibt weiß ich und mein Manifest was ich mir manuell für meine Anwendung erstellt habe ist auch richtig, meiner Ansicht nach. Aber wie bereits gesagt tut sich da bei mir die Frage auf, reicht es wenn ich die Manifestdatei einfach ins gleiche Verzeichnis tue, in welchem auch die .exe liegt oder muss ich es einbinden ins Programm, falls ja wie?Hier mein Manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="ApplicationName" type="win32"/> <description>Description of your application</description> <!-- Identify the application security requirements. --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly>Die Namensgebung ist konsistent, was Anwendungsnamen, Dateinamen etc. pp anbelangt.
Wie ich das Manifest "einbinde" habe ich mitlerweile rausbekommen.
Ich erhalte dennoch mit dem obenstehendem Manifest keinen Zugriff auf die Registry, bzw. keinen Schreibzugriff auf HKEY_LOCAL_MACHINE\SOFTWARE.Grüße,
-
WIE hast Du es denn eingebunden?
Du musst es als Resource einbinden...resource.h
#define IDR_MANIFEST 1 #define RT_MANIFEST 24res.rc2:
IDR_MANIFEST RT_MANIFEST MOVEABLE PURE "res\YourAppName.manifest"Auch ist Deine manifest-Datei falsch, da das "trustInfo" den falschen Namespace hat! Korrekt wäre:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level='requireAdministrator' uiAccess='false' /> </requestedPrivileges> </security> </trustInfo> </assembly>
-
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 includesCREATEPROCESS_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,
-
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.aspxAlso, 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\testkey1Hast 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.