【小沐学C++】C++ 访问注册表(64位系统)

在这里插入图片描述

1、问题描述

HKEY_LOCAL_MACHINE\Software\Wow6432Node\XXXX中“Wow6432Node”在32位Windows上则不存在,怎么统一处理?

2、问题分析

Either KEY_WOW64_32KEY or KEY_WOW64_64KEY can be specified. If both flags are specified, the function fails with ERROR_INVALID_PARAMETER.
  Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP: If both flags are specified, the function’s behavior is undefined.
  
注册表
C++ - 使用新式 C++ 访问 Windows 注册表
注册表项安全性和访问权限

含义
KEY _ WOW64 _ 32KEY (0x0200)指示 64 位注册表上的Windows应在 32 位注册表视图上运行。 此标志被 32 位或 32 位Windows。 有关详细信息,请参阅 访问备用注册表视图。
KEY _ WOW64 _ 64KEY (0x0100)指示 64 位注册表上的Windows应在 64 位注册表视图上运行。 此标志被 32 位或 32 位Windows。 有关详细信息,请参阅 访问备用注册表视图。此标志必须与此表中查询或访问注册表值的其他标志结合使用 OR 运算符。Windows 2000: 不支持此标志。此标志必须与此表中查询或访问注册表值的其他标志结合使用 OR 运算符。Windows 2000: 不支持此标志。

不要尝试Wow6432Node,因为32位Windows没有。

64bit系统的注册表分32 位注册表项和64位注册表项两部分。
在64bit系统下,通过regedit中查看到指定路径下的注册表项均为64位注册表项,而32位注册表项被重定位到:HKEY_LOCAL_MACHINE\Software\WOW6432Node

应用程序操作注册表的时候也分32bit方式和64bit方式。
运行于64bit系统下的32bit应用程序默认操作32位注册表项(即被重定向到WOW6432Node下的子项);而64bit应用程序才是操作的直观子项。
比如,同在64bit系统下,使用如下代码访问注册表:

::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Sobey\\MPC "), 0, KEY_ALL_ACCESS, &hKey)

  • 如果应用程序为32bit子系统,那么实际访问的注册表位置为(默认操作):

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sobey\MPC

  • 而如果应用程序为64bit子系统,那么实际访问的注册表位置将会是(默认操作):

HKEY_LOCAL_MACHINE\SOFTWARE\Sobey\MPC

3、程序编写

编程过程中,可以使用KEY_WOW64_64KEY和KEY_WOW64_32KEY明确的指定操作64位注册表项或者32位注册表项。

  • 在32bit子系统应用程序中,可以用如下方式明确指定访问64bit注册表项,程序代码:
    ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Sobey\\MPC "), 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey)

注意关键字KEY_WOW64_64KEY;这种方式写入的注册表项将会确切的位于位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Sobey\MPC

  • 在64bit子系统应用程序中,可以用如下方式明确指定访问32bit注册表项,程序代码:
    ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Sobey\\MPC\\Test"), 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &hKey)

注意关键字KEY_WOW64_32KEY, 这种方式写入的注册表项将会确切的位于位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sobey\MPC(使用regedit工具软件对应的位置)。

4、注意事项

4.1 使用HKEY_CURRENT_USER

上述说明只针对HKEY_LOCAL_MACHINE主键而言,HKEY_CURRENT_USER主键下没有类似情况;当访问HKEY_CURRENT_USER主键时,明确指定KEY_WOW64_64KEY和KEY_WOW64_32KEY标志也没有意义。
总之,尽可能使用HKEY_CURRENT_USER主键来保存用户配置吧。

4.2 使用HKEY_LOCAL_MACHINE

在64位电脑上操作以HKEY_LOCAL_MACHINE主键的时候,首先保证一下几项:
请用户以管理员权限或Administrator管理员账户来执行应用程序。

默认情况下,在64位系统上,32位程序访问32位注册表,64位程序访问64位注册表。

  • 32位程序需要访问64位注册表,需要添加KEY_WOW64_64KEY标志;
  • 64位程序需要访问32位注册表,需要添加KEY_WOW64_32KEY标志;
  • 如未指定则按照默认的处理。目前64位系统上的32位注册表位于HKCU/HKLM下的\SOFTWARE\Wow6432Node,但不要直接访问该键。

4.3 使用HKEY_CLASSES_ROOT

注意字符集。VS新版都默认Unicode字符集。
HKEY_CLASSES_ROOT主键虽然不区分32位和64位注册表,但需要管理员权限才能进行创建子项操作。此外读写操作不需要管理员权限。

4.4 权限

一般不要使用KEY_ALL_ACCESS。对于只读访问,指定KEY_READ,对于读/写KEY_READ|KEY_WRITE。如果指定的特权超出了所需的数量,则最终可能一无所获,或者迫使用户始终以管理员权限运行程序。通常,它是一种通用的安全性方法,称为"最小特权原则"。

当然将KEY_ALL_ACCESS改为KEY_QUERY_VALUE,应用程序就能在所有的平台上正常运行了。

后续

如果你觉得这些文字有一点点用处,可以给作者点个赞;╮( ̄▽ ̄)╭
如果你感觉作者写的不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
谢谢各位小伙伴们啦( ´ ▽ ‘)ノ ( ´ ▽ ` )っ!!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值