关于mysql:C-访问注册表64位系统

2次阅读

共计 2471 个字符,预计需要花费 7 分钟才能阅读完成。

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

正文完
 0