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.

批示 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,应用程序就能在所有的平台上失常运行了。