C++ 在64位和32位窗口中读取注册表

C++ 在64位和32位窗口中读取注册表,c++,winapi,mfc,registry,C++,Winapi,Mfc,Registry,我正在64位Windows-7中编写一个应用程序。在注册表中,我有一个要从以下路径读取的键: HKEY\U LOCAL\U MACHINE\Software\Wow6432Node\XXXX 我首先尝试使用以下代码打开密钥: RegOpenKeyEx(HKEY_LOCAL_MACHINE, Path, 0, KEY_ALL_ACCESS, &hKey) 在那之后,我可以读取这些值。这在64位Windows上运行良好,但在32位Windows上不起作用。在32位Windows上读取它应

我正在64位Windows-7中编写一个应用程序。在注册表中,我有一个要从以下路径读取的键:

HKEY\U LOCAL\U MACHINE\Software\Wow6432Node\XXXX

我首先尝试使用以下代码打开密钥:

RegOpenKeyEx(HKEY_LOCAL_MACHINE, Path, 0, KEY_ALL_ACCESS, &hKey) 

在那之后,我可以读取这些值。这在64位Windows上运行良好,但在32位Windows上不起作用。在32位Windows上读取它应该怎么做?

Windows 64位系统将注册表分为两部分。一个用于32位系统,另一个用于64位系统。 我认为您应该将您的呼叫更新为以下内容:

RegOpenKeyEx(HKEY_LOCAL_MACHINE, Path, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &hKey)

WOW64仿真器以及
Wow6432Node
键在32位版本的Windows上不存在,仅在64位Windows上存在。在64位Windows上运行的32位应用程序在尝试访问
HKEY\U LOCAL\U MACHINE\Software\Wow6432Node\XXXX
键时,会重定向到
HKEY\U LOCAL\U MACHINE\Software\XXXX

正确的解决方案是始终使用正常路径,而不指定
Wow6432Node
。在64位窗口上,如果希望64位进程访问32位密钥,请使用
KEY\u WOW64\u 32KEY
标志;如果希望32位进程访问64位密钥,请使用
KEY\u WOW64\u 64KEY
标志

在您的示例中,请尝试以下方法:

REGSAM Rights = KEY_QUERY_VALUE;
#ifdef _WIN64
Rights |= KEY_WOW64_32KEY;
#endif

RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\XXXX"), 0, Rights, &hKey);
有关更多详细信息,请阅读MSDN文档:


问题是,32位应用程序实际上具有访问虚拟化,应该只为32位Windows编写;64位Windows将透明地执行重定向,所以不要尝试Wow6432Node,因为32位Windows没有这样的功能,这不是您必须解决的问题,您的64位程序将无法运行。假设您实际上构建了两个调味品,考虑省略“WoW64 32节点”,包括KYKYWOW64、32位密钥,这样您就可以始终得到32位的视图。在路径中,您不必使用<代码> WoW64 32节点>代码>,您需要使用代码> ReGuPEKEXEW(HKEY-LoalAlxMeX),L“软件\xxxx”,0,KEYYAL Access KEY WOW64 64 32 KEY,和HKEY)/Boo>您几乎不应该使用
键\u ALL\u ACCESS
。对于只读访问,请指定
KEY\u read
,对于读/写
KEY\u read | KEY\u write
。如果您指定的权限超过所需的权限,则可能最终将一无所获,或强制用户始终以管理员权限运行您的程序。一般来说,这是一种常见的安全方法,称为“。。。。并从路径中删除“Wow6432Node\”。无需使用
#ifdef
,您可以一直按原样使用
键。谢谢!对于总是以32位进程运行的MSI安装程序,我必须读取64位注册表,并使用标志
KEY\u WOW64\u 64KEY
工作。