当前位置:首页 > 开发 > 编程语言 > C/C++ > 正文

使用C++开发写注册表功能

发表于: 2015-04-23   作者:冤大头_718   来源:转载   浏览:
C++
摘要: [align=left64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项。许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然。 64 位版本 Windows 包含的默认 64 位版本注册表编辑器 (Regedit.exe) 可显示 64 位和 32 位的 注册表项。WOW64 注册表重定向器为 32 位程序提供了对应于 32 位程序注册表项的不同
[align=left64 位版本 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 位版本的注册表编辑器,请按照下列步骤操作:
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节点下找到了添加的值

使用C++开发写注册表功能

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Pyth
昨天受一朋友要求,帮忙写一个用C++读取注册表的程序。这个朋友是搞Java的,肯定不知道C++怎么写啦
不知道原文地址,给出获得这篇文章的地址:http://kylix.linuxaid.com.cn/book/wxWindowstut/wxTuto
/***************************************************** *作 者:温子祺 *联系方式 :wenziqi@hot
作者:CYM 众所周知,脚本的重要性不言而喻.特别是在游戏引擎开发中, 也许一个游戏引擎的物理,人工智
C++ Plus 使用 Visual C++ 2008 功能包加强 Windows 应用程序 Kenny Kerr 本文以 Visual C++ 功能包
C++ Plus 使用 Visual C++ 2008 功能包加强 Windows 应用程序 Kenny Kerr 本文以 Visual C++ 功能包
此为转贴文章,但对一些语句有修改。 使用Visual C++的防御功能保护你的代码 <span style="FONT-
本文以 Visual C++ 功能包的预发布版为基础。文中包含的所有信息均有可能变更。 本文讨论: Microsof
C++ Plus 使用 Visual C++ 2008 功能包加强 Windows 应用程序 Kenny Kerr 本文以 Visual C++ 功能包
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号