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 位版本的注册表编辑器,请按照下列步骤操作:
1.单击“开始”,然后单击“运行”。
2.在“打开”框中,键入 %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[/align]
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; ((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(BST_CHECKED); WritePrivateProfileString(_T("AutoRun"),_T("Judge"),"1",".\\Config.ini"); //获取 HKEY_LOCAL_MACHINE的Software\\Microsoft\\Windows\\CurrentVersion\\Run 键的访问句柄; long lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,KEY_WRITE,&hkey); if(lRet==ERROR_SUCCESS) { //得到Openexe的绝对路劲 GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH); //用ReleaseBuffer去掉exepath没有用到的空间(因为exepath.GetBuffer(MAX_PATH)得到了一个存放路径的最大空间) exepath.ReleaseBuffer(); //在hkey中注册一个名为exepath的值,其值为(const BYTE*)exepath.GetBuffer(exepath.GetLength()),长度为exepath.GetLength() lRet=RegSetValueEx(hkey,exepath,0,REG_SZ,(const BYTE*)exepath.GetBuffer(exepath.GetLength()),exepath.GetLength()); //释放指定注册键的句柄hkey RegCloseKey(hkey); //将开机是否自动启动的标志置为0 if(lRet!=ERROR_SUCCESS) { AfxMessageBox("系统参数错误,不能完成开机启动设置"); } }
在代码运行后没有出现错误提示,但是在注册表就是找不到添加进去的值,郁闷了半天,后面看到上面的文章.了解到
因为64位系统的注册表是分32和64的 所以在WOW6432Node节点下找到了添加的值