Вопрос по registry-virtualization, windows, c++, registry, 64bit – Доступ к 64-битному реестру из 32-битного приложения

16

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

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

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

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

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

Это 32-битное приложение? Adriano Repetti

Ваш Ответ

2   ответа
27

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

Из MSDN:

On 64-bit Windows, portions of the registry entries are stored separately for 32-bit application and 64-bit applications and mapped into separate logical registry views using the registry redirector and registry reflection, because the 64-bit version of an application may use different registry keys and values than the 32-bit version. There are also shared registry keys that are not redirected or reflected.

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

Solution
Что вам нужно сделать, это явноask 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);

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

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

@vladimir да с помощью пути вы можете получить доступ к 32-битному реестру из 64-битного приложения без флагов, но обратное невозможно. Однако с флагами вы можете сделать оба пути.
@ adriano-repetti Относительно этого примечания: Разве Wow6432 не является узлом, где хранятся 32-битные ключи? Вы можете получить доступ к 32-битным ключам по их пути в 64-битном режиме, но не наоборот.
Спасибо ... Это работает ... Harikrishna R
-3

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

Обратите внимание, что на OP написано "Мы можем просмотреть этот путь через regedit. & Quot;

Похожие вопросы