Подтвердить что ты не робот

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

Мне нужно открыть запись реестра "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" в С++. Он содержит 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")...

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

4b9b3361

Ответ 1

Разделы реестра для 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);

в

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

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

Ответ 2

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

Убедитесь, что ключ {26A24AE4-039D-4CA4-87B4-2F86416024FF} действительно существует в разделе ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Windows\CurrentVersion\Uninstall