Доступ к 64-битному реестру из 32-битного приложения

Мне нужно открыть запись реестра "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}".

Мы можем просмотреть этот путь через 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")...

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


person Harikrishna R    schedule 10.05.2012    source источник


Ответы (2)


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

Из MSDN:

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

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

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

См. Эту ссылку в MSDN для получения дополнительных сведений: Доступ к Альтернативный вид реестра.

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

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

to:

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, но вы не должны полагаться на него, он стабилен, но его следует рассматривать как деталь реализации, которая может быть изменена.

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

person Adriano Repetti    schedule 10.05.2012
comment
@ adriano-repetti Относительно этого примечания: разве Wow6432Node не является единственным местом, где хранятся 32-битные ключи? Вы можете получить доступ к 32-битным ключам через их путь в 64-битном режиме, но не наоборот. - person Valdimar; 24.09.2015
comment
@vladimir да, с указанием пути вы можете получить доступ к 32-битному реестру из 64-битного приложения без флагов, но обратное невозможно. Однако с флагами можно поступать обоими способами. - person Adriano Repetti; 24.09.2015

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

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

person Zaid Amir    schedule 10.05.2012