2012-05-10 122 views
13

我需要在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}"从32位应用程序访问64位注册表

我们可以通过注册表查看这条路径。我使用

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")... 

返回成功的结果。我能做什么?

+0

它是一个32位应用程序? –

回答

-2

错误2意味着注册表路径不存在。

确认键{26A24AE4-039D-4CA4-87B4-2F86416024FF}下SOFTWARE \微软\的Windows \ CurrentVersion \卸载

+3

注意OP说:“我们可以通过注册表查看此路径。” – PlasmaHH

24

为32位和64个应用程序的注册表项是分开的,你可以实际存在无法直接访问32位应用程序的64位注册表。在你的情况下,注册表的32位部分中不存在所需的配置单元,那么你只能访问父文件夹。

从MSDN:

在64位Windows中,注册表项的多个部分被分别用于32位应用程序和64位应用程序存储并映射到使用注册表重定向器和注册表单独的逻辑注册表视图反射,因为64位版本的应用程序可能使用不同的注册表项和值,而不是32位版本。还有一些共享的注册表键没有被重定向或反映。

你可以阅读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使用的虚拟化节点,但你不应该依赖于这个,这是稳定的,但它应该被视为一个实现细节可能会改变。

参考文献
- Registry Virtualization MSDN上。
- 读者我觉得对这个职位感兴趣提示:http://poshcode.org/2470,它是PowerShell的,但它说明了如何从32位应用程序访问WMI数据(相对于64位注册表部分)。

+0

谢谢你...它的工作... –

+0

@ adriano-repetti关于该注意:是不是Wow6432Node只存储32位密钥的地方?您可以在64位模式下通过它们的路径访问32位密钥,但不能以其他方式访问。 – Valdimar

+0

@vladimir是与路径,您可以访问从64位应用程序32位注册表没有标志,但相反的是不可能的。然而,有了旗帜,你可以用两种方式。 –

相关问题