Ключи реестра для 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