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数据。