从32位应用程序访问64位registry

我需要在c ++中打开一个registry"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}" 。 它包含Java 64位应用程序。 该registry项的完整path是"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"

我们可以通过registry来查看这个path。 我用

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

用于打开registry; 但它返回错误值(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标志添加到您的调用中完成(您可以使用KEY_WOW64_32KEY从64位应用程序访问32位注册表)。 请注意,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意味着注册表路径不存在。

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