2012-05-10 10 views
13

Ich muss einen Registrierungseintrag öffnen "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" in C++. Es enthält die Java 64-Bit-Anwendung. Der vollständige Pfad dieses Registrierungseintrags lautet "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}".Zugriff auf 64-Bit-Registrierung von 32-Bit-Anwendung

Wir können diesen Pfad durch regedit anzeigen. Ich verwende

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey) 

für die Registrierung öffnen; Aber es gibt den Fehlerwert (2) zurück.

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")... 

gibt ein Erfolgsergebnis zurück. Was kann ich tun?

+0

Ist es eine 32-Bit-Anwendung? –

Antwort

-2

Fehler 2 bedeutet, dass der Registrierungspfad nicht existiert.

Stellen Sie sicher, dass der Schlüssel {26A24AE4-039D-4CA4-87B4-2F86416024FF} existiert tatsächlich unter SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall

+3

Beachten Sie die OP-Sprichwort "Wir können diesen Weg durch Regedit sehen." – PlasmaHH

24

Die Registrierungsschlüssel für 32-Bit und 64-Anwendungen getrennt sind, können Sie Sie können nicht direkt auf die 64-Bit-Registrierung von Ihrer 32-Bit-Anwendung zugreifen. In Ihrem Fall existiert die erforderliche Struktur nicht in dem 32 Bit Teil der Registrierung, dann können Sie nur auf den übergeordneten Ordner zugreifen.

Von MSDN:

Auf 64-Bit-Windows, Teile der Registrierungseinträge für separat gespeichert werden, 32-Bit-Anwendung und 64-Bit-Anwendungen und in separate logische Registrierungs Ansichten mithilfe der Registrierung Redirector und Registry kartiert Reflektion, da die 64-Bit-Version einer Anwendung möglicherweise andere Registrierungsschlüssel und -werte verwendet als die 32-Bit-Version. Es gibt auch gemeinsame Registrierungsschlüssel, die nicht umgeleitet oder reflektiert werden.

Sie können die Liste auf MSDN lesen: Registry Keys Affected by WOW64. Leider wird die SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall nicht erwähnt, aber es ist auch betroffen.

Lösung
Was müssen Sie tun, ist fragen explizit RegOpenKeyEx die 64-Bit-Teil der Registrierung zuzugreifen. Dies kann durch Hinzufügen des Flags KEY_WOW64_64KEY zu Ihrem Aufruf geschehen (Sie können auf die 32-Bit-Registrierung von einer 64-Bit-Anwendung aus zugreifen, indem Sie KEY_WOW64_32KEY verwenden). Bitte beachten Sie, dass dieses Flag unter Windows 2000 nicht unterstützt wird. Wenn Ihre Anwendung mit dieser (alten) Version kompatibel sein muss, müssen Sie den Fall verwalten.

Weitere Informationen finden Sie unter diesem Link auf MSDN: Accessing an Alternate Registry View.

Um es einfach zu machen, einfach Ihren Anruf aus ändern:

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS, &hKey); 

zu:

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"), 
    0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey); 

Hinweis
Beachten Sie, dass Sie den Schlüssel nur über seine Pfad zugreifen können, ohne alle Flags mit dieser HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall. Da der Wow6432 Knoten ist virtualisierten Knoten von WOW64 verwendet, aber Sie sollten sich nicht darauf verlassen, es ist stabil, aber es sollte als eine Implementierung Detail Änderung zu betrachten.

Referenzen
- Registry Virtualization auf MSDN.
- Leser meine finden interessante Tipps zu diesem Post: http://poshcode.org/2470, es ist für die PowerShell, aber es erklärt, wie auf WMI-Daten (relativ zum 64-Bit-Registrierungsteil) von einer 32-Bit-Anwendung zugreifen.

+0

Vielen Dank ... Seine Arbeit ... –

+0

@ adriano-repetti In Bezug auf diese Anmerkung: Ist nicht der Wow6432Node nur der Ort, wo die 32-Bit-Schlüssel gespeichert sind ? Sie können auf die 32-Bit-Schlüssel über ihren Pfad im 64-Bit-Modus zugreifen, aber nicht umgekehrt. – Valdimar

+0

@vladimir ja mit Pfad können Sie 32-Bit-Registrierung von 64-Bit-App ohne Flags zugreifen, aber das Gegenteil ist nicht möglich. Mit Flags können Sie jedoch beide Möglichkeiten nutzen. –