在64位和32位Windows中读取注册表

3

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

HKEY_LOCAL_MACHINE\Software\Wow6432Node\XXXX

我首先尝试使用以下代码打开该键:

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

在此之后,我能够读取这些值。这在64位Windows上运行良好,但是在32位Windows上不起作用。应该如何才能在32位Windows上读取它?


所以不要尝试使用Wow6432Node,因为32位Windows没有这个。 - Paul Stelian
如果我不使用Wow6432Node,它也无法在64位机器上工作。 - Sandeep Kumar
3
好的,您需要翻译的内容是:“嗯,并不是你需要解决的问题,因为你的64位程序将无法运行。假设你确实构建了两种版本,请考虑省略“Wow6432Node”,并包括KEY_WOW64_32KEY,这样你就总是可以获得32位视图。” - Hans Passant
2
Path中,您不能使用Wow6432Node,您需要使用RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\XXXX", 0, KEY_ALL_ACCESS|KEY_WOW64_32KEY, &hKey) - RbMm
3
顺便提一下,你几乎不应该使用KEY_ALL_ACCESS。如果需要只读访问,请指定KEY_READ,如果需要读/写,则为KEY_READ|KEY_WRITE。如果指定了比所需权限更多的特权,可能会得到空白结果,或者强制用户始终以管理员权限运行您的程序。这是通常的安全做法,被称为“最小特权原则”。 - zett42
显示剩余4条评论
2个回答

5

Windows 64位系统将注册表分为32位和64位两个部分。我认为您应该更新您的调用如下:

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

6
请将路径中的 "Wow6432Node" 移除。 - zett42

3
WOW64模拟器和因此Wow6432Node键仅存在于64位Windows上,而不是32位Windows上。在64位Windows上运行的32位应用程序尝试访问HKEY_LOCAL_MACHINE\Software\XXXX时,会被重定向到HKEY_LOCAL_MACHINE\Software\Wow6432Node\XXXX键。
正确的解决方案是始终使用正常路径,而不指定Wow6432Node。在64位Windows上,如果您想让64位进程访问32位键,则使用KEY_WOW64_32KEY标志,如果您想让32位进程访问64位键,则使用KEY_WOW64_64KEY标志。
在您的示例中,请尝试使用以下内容:
REGSAM Rights = KEY_QUERY_VALUE;
#ifdef _WIN64
Rights |= KEY_WOW64_32KEY;
#endif

RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\XXXX"), 0, Rights, &hKey);

阅读MSDN文档以获取更多详细信息:

注册表重定向

WOW64影响的注册表键

访问备用注册表视图


无需使用 #ifdef,可以始终使用 KEY_WOW64_32KEY,因为它将在32位Windows上被忽略 - zett42
谢谢!对于我的始终作为32位进程运行的MSI安装程序,我必须读取64位注册表,并使用标志“KEY_WOW64_64KEY”才能正常工作。 - Vuwox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接