从32位应用程序访问64位注册表

18

我需要在C++中打开一个名为"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"的注册表项,其中包含Java 64位应用程序。该注册表项的完整路径是"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")...

返回成功结果。我该怎么办?

2个回答

31
32位和64位应用程序的注册表键是分开的,你无法直接从32位应用程序访问64位注册表。在你的情况下,在32位注册表的部分中所需的子项不存在,因此只能访问父文件夹。
根据MSDN的说明:
在64位Windows上,由于64位版本的应用程序可能使用与32位版本不同的注册表键和值,因此将部分注册表条目分别存储为32位应用程序和64位应用程序,并使用registry redirector和 registry reflection将其映射到单独的逻辑注册表视图中。还有一些共享的注册表键不会被重定向或反射。
你可以在MSDN上查看受影响的注册表键列表:Registry Keys Affected by WOW64。不幸的是,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall没有被提及,但它也受到影响。
解决方案
你需要显式地请求RegOpenKeyEx访问注册表的64位部分。这可以通过在调用中添加KEY_WOW64_64KEY标志来完成(可以使用KEY_WOW64_32KEY从64位应用程序访问32位注册表)。请注意,此标志不支持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使用的虚拟化节点,但您不应该依赖它,它是稳定的,但应将其视为可能会改变的实现细节。

参考
- MSDN上的注册表虚拟化
- 读者可能会发现有趣的提示在这篇文章中:http://poshcode.org/2470,它是针对PowerShell的,但解释了如何从32位应用程序中访问相对于64位注册表部分的WMI数据。


关于那个注释:Wow6432Node不仅仅是存储32位键的地方吗?在64位模式下,您可以通过其路径访问32位键,但反之则不行。 - Valdimar
@vladimir 是的,使用路径可以在64位应用程序中访问32位注册表而无需标志,但反之则不行。但是,使用标志可以双向操作。 - Adriano Repetti

-4

错误2表示注册表路径不存在。

请确保在SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下实际存在密钥{26A24AE4-039D-4CA4-87B4-2F86416024FF}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接