Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从32位应用程序访问64位注册表_C++_Windows_Registry_64 Bit_Registry Virtualization - Fatal编程技术网

C++ 从32位应用程序访问64位注册表

C++ 从32位应用程序访问64位注册表,c++,windows,registry,64-bit,registry-virtualization,C++,Windows,Registry,64 Bit,Registry Virtualization,我需要在C++中打开注册表项“软件\微软\ \Windows \\CurrnEdvest\\卸载”26A24A4-039—4CA4-7B4-2F864 16024FF} 。它包含java 64位应用程序。该注册表项的完整路径是“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}” 我们可以通过regedit查看此路径。我用 ret

我需要在C++中打开注册表项<代码>“软件\微软\ \Windows \\CurrnEdvest\\卸载”26A24A4-039—4CA4-7B4-2F864 16024FF} 。它包含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)


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

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


确保注册表项{26A24AE4-039D-4CA4-87B4-2F86416024FF}实际上存在于SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

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

从MSDN:

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

您可以阅读MSDN上的列表:。不幸的是,
SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
没有被提及,但它也受到了影响

解决方案
您需要做的是显式地要求
RegOpenKeyEx
访问注册表的64位部分。这可以通过将
KEY\u WOW64\u 64KEY
标志添加到您的呼叫中来完成(您可以使用
KEY\u WOW64\u 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);
致:

注意
请注意,您可以使用此
HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
仅通过其路径访问密钥,而不使用任何标志。 由于
Wow6432
节点是WOW64使用的虚拟化节点,但您不应依赖于此,因此它是稳定的,但应视为一个可能发生更改的实现细节

参考资料
-在MSDN上。

-读者可以在这篇文章中找到一些有趣的提示:,这是针对PowerShell的,但它解释了如何从32位应用程序访问WMI数据(相对于64位注册表部分)。

@adriano repetti关于这一点的注意事项:WOW6432节点不是唯一存储32位键的地方吗?在64位模式下,您可以通过其路径访问32位键,但不能通过其他方式访问。@vladimir yes with path您可以从64位应用程序访问32位注册表,而不带标志,但不能使用相反的方式。但是,使用标志,您可以同时使用这两种方法。
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);