2012-05-10 4 views
13

Мне нужно открыть запись в реестре "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" в C++. Он содержит 64-битное приложение java. Полный путь к этой записи реестра - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}".Доступ к 64-битовому реестру из 32-разрядного приложения

Мы можем просмотреть этот путь через regedit. Я использую

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

для открытия реестра; Но он возвращает значение ошибки (2).

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

возвращает результат успеха. Что я могу сделать?

+0

Это 32-разрядное приложение? –

ответ

-2

Ошибка 2 означает, что путь к реестру не существует.

Убедитесь, что ключ {26A24AE4-039D-4CA4-87B4-2F86416024FF} на самом деле существует в SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall

+3

Обратите внимание на OP, говорящий «Мы можем просмотреть этот путь через regedit». – PlasmaHH

24

ключи реестра для 32-битной и 64 приложений разделены, вы можете 't (напрямую) 64-битный реестр из 32-разрядного приложения. В вашем случае требуемый куст не существует в 32-битной части реестра, тогда вы можете получить доступ только к родительской папке.

Из MSDN:

На 64-битной Windows, часть записей реестра хранится отдельно для 32-разрядных приложений и 64-разрядных приложений и отображенной на отдельные логические взгляды реестра с помощью редиректор реестра и реестр поскольку 64-разрядная версия приложения может использовать разные ключи и значения реестра, чем 32-разрядная версия. Существуют также общие ключи реестра, которые не перенаправлены или не отражены.

Вы можете прочитать список на MSDN: Registry Keys Affected by WOW64. К сожалению, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall не упоминается, но это также затронуло.

Решение
То, что вы должны сделать, это явно спроситьRegOpenKeyEx для доступа к 64 разрядной части реестра. Это можно сделать, добавив флаг KEY_WOW64_64KEY к вашему вызову (вы можете получить доступ к 32-битовому реестру из 64-разрядного приложения, используя KEY_WOW64_32KEY). Обратите внимание, что этот флаг не поддерживается в Windows 2000, тогда, если ваше приложение должно быть совместимо с этой (старой) версией, вам необходимо управлять этим случаем.

Дополнительную информацию см. На этой странице в MSDN: Accessing an Alternate Registry View.

Чтобы сделать это легко, просто изменить свой звонок от:

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

к:

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

Примечания
Обратите внимание, что вы можете получить доступ к ключу только через его пути без любые флаги с использованием этого HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall. Поскольку узел Wow6432 является виртуализированным узлом, используемым WOW64, но вы не должны полагаться на это, он стабилен, но его следует рассматривать как деталь реализации, подлежащую изменению.

Ссылки
- Registry Virtualization на MSDN.
- Читатели мои находят интересные советы по этому сообщению: http://poshcode.org/2470, это для PowerShell, но в нем объясняется, как получить доступ к данным WMI (относительно 64-разрядной части реестра) из 32-разрядного приложения.

+0

Спасибо ... Его работа ... –

+0

@ adriano-repetti Относительно этой заметки: Разве Wow6432Node не хранит только 32-битные ключи ? Вы можете получить доступ к 32-битным ключам по их пути в режиме 64 бит, но не наоборот. – Valdimar

+0

@ vladimir yes с помощью пути вы можете получить доступ к 32-битовому реестру из 64-битного приложения без флагов, но наоборот невозможно. Однако с помощью флагов вы можете делать оба способа. –