我需要打开一个注册表项"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"
在C ++中。 它包含了Java的64位应用程序。 该注册表项的完整路径是"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"
我们可以通过注册表编辑器查看该路径。 我用
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")...
返回成功的结果。 我能做什么?
对于32位和64个应用程序是分开的注册表键,你不能从你的32位应用程序访问(直接)的64位注册表。 你的情况需要的蜂巢不会在注册表中的32位一部分而存在,那么你只能访问父文件夹。
从MSDN:
在64位的Windows,注册表项的部分被用于32位应用程序和64位应用程序分开存储并映射到使用注册表重定向器和注册表反射单独的逻辑注册表意见,因为一个应用程序的64位版本可以使用不同的注册表键和值大于32位版本。 有没有被重定向或反射也分享注册表项。
你可以阅读MSDN名单: 由WOW64影响的注册表键 。 不幸的是, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
没有被提及,但它的影响太大。
解
你有什么要做的就是明确要求 RegOpenKeyEx
访问注册表的64位部分。 这可以添加KEY_WOW64_64KEY
标志您的通话(你可以使用一个64位的应用程序访问32位注册表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);
注意
请注意,您可能只能通过其路径访问键不使用这个任何标志HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
。 因为Wow6432
节点是WOW64使用的虚拟节点,但你不应该依赖于这个,这是稳定的,但它应该被视为一个实现细节可能会改变。
参考
- 注册表虚拟化 MSDN上。
-读者我觉得对这个职位感兴趣提示: http://poshcode.org/2470 ,它是PowerShell的,但它说明了如何从32位应用程序访问WMI数据(相对于64位注册表部分)。
错误2指的注册表路径不存在。
确保键{26A24AE4-039D-4CA4-87B4-2F86416024FF}下SOFTWARE \微软\的Windows \ CurrentVersion \卸载确实存在