17

我需要"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}".

我们可以通过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")...

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

4

2 回答 2

30

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);

注意 请
注意,您只能通过其路径访问密钥,而无需使用 this 的任何标志HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall。因为该Wow6432节点是 WOW64 使用的虚拟化节点,但您不应该依赖它,它是稳定的,但应将其视为可能更改的实现细节。

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

于 2012-05-10T12:20:39.917 回答
-3

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

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

于 2012-05-10T12:13:39.043 回答