CRegKey
1.简介
CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的打开注册表的某个分支或子键(CRegKey::Open),可以方便的修改一个键的键值(CRegKey::SetValue),也可以查询某个键的键值(CRegKey::QueryValue),操作完成之后,可以关闭子键(CRegKey::Close)。
要想使用CRegKey类,需要包含头文件atlbase.h
2.常用操作方法
1) 打开需要查询或修改的注册表键
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
hKeyParent参数指定了待打开的注册表键的句柄,常用的可选值为
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
以上四个值分别代表了注册表中最主要的四个分支;
lpszKeyName参数指定了在hKeyParent下需要打开的项的名字;
samDesired参数指定了打开该项后所拥有的权限,默认为KEY_ALL_ACCESS,表示拥有对该分支的所有操作权,包括读和写等。
举例:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows") != ERROR_SUCCESS)
3: {
4: AfxMessageBox("Error open reg key!!");
5: }
2) 查询注册表项中的某个键的键值
LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
查询键值提供了两种形式,分别用来获取数值类型的值和字符串类型的值。在上面的形式中,第一种用于获取数值类型的值,第二种用于获取字符串类型的值。
lpszValueName参数用来指定键的名称,dwValue和szValue用于保存键值,而pdwCount用来控制获取到的字符串值的长度
举例:
比如,假设要获得windowx系统默认的桌面壁纸的搜索路径,由于这个路径保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion这一项的WallPaperDir键内,如下图

所以,可以用以下的代码来实现:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion") != ERROR_SUCCESS)
3: AfxMessageBox("Error open reg key!!!");
4: else
5: {
6: char szPath[MAX_PATH];
7: DWORD dwLen = myKey.QueryValue(szPath, "WallPaperDir", MAX_PATH);
8: }
另外,如果我们想查询某个项的默认键值该怎么办呢?只需要将lpszValueName参数写为空字符串就好了。比如现在想看一下.txt类型的文件的关联程序是谁,我们需要首先在HKEY_CLASSES_ROOT下找到.txt项,然后看它的默认键值是多少:

示例代码如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CLASSES_ROOT, ".txt") != ERROR_SUCCESS)
3: AfxMessageBox("Error open key!!!");
4: else
5: {
6: char szFileType[255];
7: DWORD dwLen = myKey.QueryValue(szFileType, "", sizeof(szFileType));
8: }
3) 添加或修改键值
LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );
LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
添加键值函数提供了三种形式,前两种分别用来向当前已经打开的这个项中添加DWORD类型的键、字符串类型的键,最后一种形式的函数,可以在某个特定的分支线下的某个特定的项内添加一个键。如果lpszKeyName指定的键不存在,则添加这个键,否则,就是修改已经存在的键的键值。另外需要注意的是,最后一种形式的SetValue函数,如果lpszKeyName所指定的项不存在,则SetValue函数会返回错误,而不会添加一个项。
示例,比如现在要给IE的工具栏设置一个背景图片,可以在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Toolbar项下面新建一个BackBitmap的字符串键,并制定背景图片的位置,代码如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CURRENT_USER, "Software//Microsoft//Internet Explorer//Toolbar") != ERROR_SUCCESS)
3: AfxMessageBox("error open reg key!!!");
4: else
5: {
6: myKey.SetValue("C://WINDOWS//Web//Wallpaper//Bliss.bmp", "BackBitmap");
7: }
这样,IE的背景图片就被设置成了C:/WINDOWS/Web/Wallpaper/Bliss.bmp
4) 删除键值
LONG DeleteValue( LPCTSTR lpszValue );
这个函数比较简单,它会删除lpszValue参数指定的键。
5) 新建项
LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL );
Create函数用于创建一个项,它可以在hKeyParent指定的分支下,创建一个名为lpszKeyName的项,后面几个参数一般用默认的即可。
比如,现在要建立一个新的文件类型.spj的关联方式,首先需要在HKEY_CLASSES_ROOT下建立一个名为.spj的项,代码如下:
1: CRegKey myKey;
2: if(myKey.Create(HKEY_CLASSES_ROOT, ".spj") != ERROR_SUCCESS)
3: AfxMessageBox("error create key!!!");
4: else
5: AfxMessageBox("create key ok!");
6) 删除项
LONG DeleteSubKey( LPCTSTR lpszSubKey );
该函数可以删除名为lpszSubKey的项,以及该项下的所有的键。注意,被删除的项不能含有子项!可以通过另外一个函数LONG RecurseDeleteKey( LPCTSTR lpszKey );删除某个项以及该项下的所有内容。
7) 关闭注册表
LONG Close( );
关闭注册表时,之前所做的修改才会被保存到硬盘。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函数在需要的时候将所做的修改及时写入硬盘。
8
{
AfxMessageBox("Successful!");
rk.Close();
}
if(rk.DeleteSubKey("4")==ERROR_SUCCESS)
{
AfxMessageBox("sucess!");
}
DWORD CTools::ReadReg(char *szName,LPCTSTRszValue)
{//szName这个注册表名。 把值存到szValue。
DWORD dwRes=1;
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
g_szFullKey,
NULL,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
return FALSE;
DWORDdwType,dwLen=SHORT_LEN;
if(RegQueryValueEx(hKey,szName,NULL,&dwType,(BYTE*)szValue,&dwLen)!=ERROR_SUCCESS)
dwRes=0;
if(RegCloseKey(hKey)!=ERROR_SUCCESS)
dwRes=0;
return dwRes;
}
CRegKey的更多相关文章
- CRegKey 注册表操作
CRegKey 注册表操作 标签: accessnulluserpathbyteie 2011-11-03 13:55 3477人阅读 评论(0) 收藏 举报 分类: win32(7) 1.简介 ...
- CRegKey 注册表操作 转
转自 http://blog.csdn.net/pbymw8iwm/article/details/6931946 1.简介 CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便 ...
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...
- 玩转Windows服务系列——服务运行、停止流程浅析
通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...
- 玩转Windows服务系列——Windows服务小技巧
伴随着研究Windows服务,逐渐掌握了一些小技巧,现在与大家分享一下. 将Windows服务转变为控制台程序 由于默认的Windows服务程序,编译后为Win32的窗口程序.我们在程序启动或运行过程 ...
- c++ 操作注册表
1. 注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...
- ICON文件保存
这两天想做一下windows系统下图标的修改,让程序有更新的时候能够更新图标的外观,达到提醒的作用,360,QQ经常采用这种方式进行更新的提示,也有采用弹框的方式来提示,用新版QVOD的同事可能见到过 ...
- vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
头文件: /*! Copyright (C) *---------------------------------------------------------------------------- ...
- vc读写注册表
注册表是Windows重要组成部分,注册表记录了大量有关电脑软硬件的信息.注册表中的值通过其名称标识.值名称由与键名相同的字符组成.值本身可以是字符串.二进制数据或者是32位无符号值.在这里我们主要运 ...
随机推荐
- Linux系统下安装和使用rz、sz命令
1.软件安装 1)编译安装 root 账号登陆后,依次执行以下命令: cd /tmp wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz ...
- BZOJ_4199_[Noi2015]品酒大会_后缀自动机
BZOJ_4199_[Noi2015]品酒大会_后缀自动机 Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席 ...
- 【AHOI 2005】 约数研究
[题目链接] 点击打开链接 [算法] 要求M,显然可以通过约数个数定理从1..N暴力计算答案,然而n最大10^6,这个算法的时间复杂度是 O(N * sqrt(N))的,不能通过此题 因此我们换一种思 ...
- vue 随笔 vue 的属性和方法
新建的项目中main.js是项目的入口文件 npm run dev 运行文件 npm run bulid 编译 属性与方法 每个Vue实例都会代理其 data 对象里所有的属性: var data= ...
- 线程Coroutines 和 Yield(转)
之前一直很纠结这个问题,在网上找到了这篇文章,给大家分享下: 第一种方法: void Start() { print("Starting " + Ti ...
- python 面向对象八 多继承
python是支持多继承的,在设计类的继承关系时,通常,主线都是单一继承下来的.但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn. 为了更好地看出继承关系,以Mi ...
- [App Store Connect帮助]八、维护您的 App(3)将 App 恢复至 App Store
如果您已将 App 从 App Store 中移除,之后创建了该 App 的一个新版本,那么即使新版本被“App 审核”批准,App 状态也仍会是“被开发者下架”.若要发布新版本,您必须首先将其恢复至 ...
- Kafaka入门篇
1.Apache Kafka - 简介 Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点. Kafka适合离线 ...
- 【CSS】少年,你想拥有写轮眼么?
最近笔者在公司内部开展了一次CSS讲座,由于授课经验不太足,授课效果自我感觉并不太好,不过课中有一个笔者用CSS写的一个小效果,其中还是包含了蛮多CSS的常见知识点的,正好也有部分同学很感兴趣如何实现 ...
- python ftp小程序练习
作业要求: 开发一个支持多用户在线的FTP程序 要求: 1.用户加密认证 2.允许同时多用户登陆 3.每个用户都有自己的家目录,并且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 ...