开发X64位系统,不但包含差异,如果使用注册表,注册表也是不同的。
2012-06-21 07:09
337 查看
如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node
作者:sdujq | 2011/8/28 14:48:49 | 阅读103次64 位版本 Windows 中的注册表分为
32 位注册表项和 64 位注册表项。许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然。
64 位版本 Windows
包含的默认 64 位版本注册表编辑器 (Regedit.exe)
可显示 64 位和 32 位的 注册表项。WOW64 注册表重定向器为
32 位程序提供了对应于
32 位程序注册表项的不同注册表项。在 64 位版本的注册表编辑器中,32
位注册表项显示在以下注册表项下: HKEY_LOCAL_MACHINE\Software\WOW6432Node使用默认的
64 位版本注册表编辑器,可以查看或编辑
64 位和 32 位的注册表项和项值。要查看或编辑 64 位注册表项,必须使用
64 位版本的注册表编辑器 (Regedit.exe)。还可以使用 %systemroot%\Syswow64 文件夹中的
32 位版本注册表编辑器查看或编辑 32 位注册表项和项值。在 32 位版本注册表编辑器中执行任务的方式与
64 位版本注册表编辑器没有区别。要打开 32 位版本的注册表编辑器,请按照下列步骤操作:
单击“开始”,然后单击“运行”。 在“打开”框中,键入
%systemroot%\syswow64\regedit,然后单击“确定”。
注意:除非使用 -m 开关启动注册表编辑器的第二个实例,否则,必须先关闭
64 位版本的注册表编辑器,然后才能打开 32 位版本的注册表编辑器(反之亦然)。例如,如果 64 位版本的注册表编辑器已经在运行,在第 2 步键入 %systemroot%\syswow64\regedit
-m 可启动 32 位版本的注册表编辑器。
为了支持 32 位和 64 位 COM 注册和程序状态的共存,WOW64 为 32 位程序提供了一种备用注册表视图。32 位程序会看到与真正的 64 位 HKEY_LOCAL_MACHINE\Software 树完全分开的
32 位 HKEY_LOCAL_MACHINE\Software 树 (HKEY_LOCAL_MACHINE\Software\WOW6432Node)。这样可以隔离 HKEY_CLASSES_ROOT,因为此树的每个计算机部分驻留在以下注册表项内: HKEY_LOCAL_MACHINE\Software为了通过
COM 和其他机制实现 64 位/32 位程序互操作性,WOW64 使用了一个“注册表反射器”来在 64 位注册表视图和 32 位注册表视图之间镜像某些注册表项和项值。该反射器是“智能”的,因为它只反射
COM 激活数据。
反射的注册表项
WOW64 注册表反射器可能会在反射过程中修改注册表项的内容和项值,目的是为了调整路径名等。因此,32位的内容与 64 位的内容可能会有所不同。下面的注册表项会被反射: HKEY_LOCAL_MACHINE\Software\Classes HKEY_LOCAL_MACHINE\Software\COM3 HKEY_LOCAL_MACHINE\Software\Ole HKEY_LOCAL_MACHINE\Software\EventSystem HKEY_LOCAL_MACHINE\Software\RPC
地址:http://blog.csdn.net/a32132100/article/details/6679547
C++ 操作64位系统,默认读取Wow6432Node子键的解决方法。
原先一个win32程序好好地,由于组里不少人用了win 7 64位操作系统,指出原程序有bug,程序不能在64位的操作系统上跑。搞了很久,后来网上搜到一些资料说:64位的操作系统:
xp下具体的程序在电脑中的位置位于:
HKEY_LOCAL_MACHINE\SOFTWARE
vista中是位于
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
如果你在vista64下面依然访问如下位置,
HKEY_LOCAL_MACHINE\SOFTWARE
你得到的其实就是vista下
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的列表。
这其中其实是WOW进行了转换。其中并给出了判断64位还是32位平台的函数:
IsWow64返回TRUE则是64位系统,否则为32位系统。
code如下:VC测试通过
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// handle error
AfxMessageBox("IsWow64 error!");
}
}
return bIsWow64;
}
然而,奇怪的是:当我们判断为: IsWow64()时,我便将注册表的地址必为:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\我要读的程序名
依然读取不成功。后来请教了一位老同事,他说这种问题,应该看微软的最新的msdn。随即搜了搜,发现:
Do not try to open Wow6432Node to view the alternate registry hive in 32-bit code. Instead open the desired branch (e.g., HKLM\Software\Microsoft\xxx) with the KEY_WOW64_64KEY flag as shown above.
意思是说:访问时,不要去打开Wow6432Node ,而应在API里使用 KEY_WOW64_64KEY 。
最后,在64位的机器上跑时,使用KEY_WOW64_64KEY标识:
retCode = RegCreateKeyEx(HKEY_LOCAL_MACHINE,subKeyName.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_EXECUTE|KEY_WOW64_64KEY, NULL, &hkey, NULL);
问题果然解决了!
加油!征途才刚刚开始!
Wow6432注册表项表明你正在运行64位版本的Windows 。操作系统使用此密钥为32位的64位版本的Windows上运行的应用程序提出HKEY_LOCAL_MACHINE \软件的一个单独的视图。当32位应用程序查询下一个值在HKEY_LOCAL_MACHINE \ SOFTWARE \ <company> \ < ...子项,应用程序读取的HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ...子项。下图显示了下的Wow6432Node结构,
32位应用程序将看到。一个“注册表反射器”复制某些值之间的32位和64位注册表视图(例如,主要用于COM注册) ,并使用最后一个作家胜的方式解决任何冲突。
相关文章推荐
- Eclipse rap 富客户端开发总结(10) -Rap不同系统间的差异和处理方式
- 不同系统下不同jre使用GBK处理特殊汉字的差异引发乱码问题
- C# *未能找到类型“ * ”,请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分,请确保已使用针对当前平台或任意 CPU 的设置成功生成该项目
- 使用java开发时该从哪些不同方面提高系统性能
- 问题阐述: 本人使用mini6410开发了一个sqlite数据库的程序,在mini6410的linux系统下已经能够成功运行了。因为Android使用的也是linux内核,所以我想当然的认为按照同样
- Win 8 系统下 JBoss AS 7 Final 的下载配置与使用——Windows J2EE开发安装序列之五
- Android系统开发中LOG的输出与使用
- 使用 FUSE 开发自己的文件系统
- iOS开发之使用Storyboard预览UI在不同屏幕上的运行效果
- 一起学windows phone7开发(二十二.使用系统资源)
- windows下eclipse中,涉及源码编译的apk开发——使用系统签名机制解决方法
- 不同浏览器中使用&nbsp的差异
- Linux系统中不同用户所使用的$PATH环境变量的区别
- <开发总结>苹果ios 系统,使用自带浏览器safari,输入正确图形验证码一直报错!
- 跨平台C++软件开发中,由于不同操作系统对Unicode的支持差异,而导致的一些问题及解决方案
- 使用Eclipse开发的ZigBee无线网络环境监测系统
- 包含别人的dll,然后我们用类库再次封装成dll的时候的注意事项;源文件与模块生成时的文件不同;创建调试信息文件 ··PDB时发生意外的错误,进程无法访问文件,因为另一个程序正在使用此文件
- 在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时,这就需要在Content-page中使用ScriptMa
- android开发 通过文字生成头像 (包含使用额外的字体)