ключи реестра для 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-разрядного приложения.
Это 32-разрядное приложение? –