注册表编程快速入门
2012-08-07 16:45
232 查看
最近涉及到了一些注册表的编程,就把入门的一些东西整理一下,各位注册表新手一起来讨论讨论。欢迎留言!
文本的完整代码在http://download.csdn.net/detail/arvon2012/4482788
文章最后给出两个注册表编程的应用实例,可以帮助大家理解:
注册表编程是什么?
我自己的理解,就是用程序完成原本手工要做的事情。那么我们通过手工可以对注册表进行哪些操作呢?增、删、改、查。我去~和数据库的基本操作一样啊~~下面一次介绍
增
直接调用一个函数RegCreateKey实现,参数中给出要添加的键的完全路径。下面直接上代码:
比如现在我要在键“HKEY_LOCAL_MACHINESOFTWARE\\Microsoft\\Windows”下面,添加一个键”MyKey“:
删
如果要把一个键删除,如删除上面创建的“HKEY_LOCAL_MACHINESOFTWARE\\Microsoft\\Windows\\MyKey”,直接调用RegDeleteKey,如下:
改
所谓的”改“,其实就是修改键中的值。或者创建一个键值。步骤分两步
1.打开要修改或者创建键值的项,如果要对一个键进行修改的操作首先一定要打开这个键,调用RegOpenKeyEx
2.调用RegSetValueExW设置要设置或者修改的键和它的值。
代码如下:
简单介绍下重要的参数。在RegOpenKeyEx中&hKey是函数运行后的输出值,表示被打开的键的句柄。句柄这种东西大家都懂的,windows里想操作什么,都要先抓到它的句柄。
在RegSetValueExW中,szValueName是键值的名字,相当于程序中的变量名,REG_SZ是键值的类型,szValueDate是键值的值,cbLen是这个键值的值的长度(毕竟一般这种值都是字符串)。
查
查主要有两种,1.对键中的某个键值的值有兴趣,调用RegQueryValueExW,2.对键的层次结构和它包含的子键有兴趣,用RegQueryInfoKey。
不过后面一个函数也能查值,很强大,它一执行,返回的是个结果的集合,里面包含被操作的键的所有直接键和这些键中的所有键值的名称。
首先第一种操作:
上面的函数中hKey是已经被打开的键的句柄;
第二个参数我输入的是NULL,代表我想获得默认键值的值,如果要获得其他键值的值,就输入其他的名字;
第四个参数是要查询出的键值的类型;
第五个参数是查出的键值的值;
最后一个参数是这个值的长度。
第二种查询代码如下:
上面的函数中KeyCnt是被查的键的第一级子键数量;
KeyMaxLen在查到的子键中,名字最长的长度。。。;
NameCnt存放了被查的键的所有键值的名字;
NameMaxLen键值最大名称长度;
MaxDateLen在查到的键值的值中的最大长度;
这个函数其实不是独立使用的,一般还会有个后续操作,就是枚举该键的所有子键和键值,如下:
关闭键
最后出门都不能忘了随手关门,用完了键当然也不能忘了关闭键:RegCloseKey(hKey);
附:注册表编程实例
1.修改注册表实现指定的后缀名和默认打开程序的绑定/article/1847951.html
2.根据给定文件名的后缀,查询注册表,创建进程用注册表中记录的默认方式打开目标文件/article/1847952.html
技术相关更多文章猛击:哇啦天堂论坛技术区
文本的完整代码在http://download.csdn.net/detail/arvon2012/4482788
文章最后给出两个注册表编程的应用实例,可以帮助大家理解:
注册表编程是什么?
我自己的理解,就是用程序完成原本手工要做的事情。那么我们通过手工可以对注册表进行哪些操作呢?增、删、改、查。我去~和数据库的基本操作一样啊~~下面一次介绍
增
直接调用一个函数RegCreateKey实现,参数中给出要添加的键的完全路径。下面直接上代码:
比如现在我要在键“HKEY_LOCAL_MACHINESOFTWARE\\Microsoft\\Windows”下面,添加一个键”MyKey“:
//创建子键 if (ERROR_SUCCESS!=RegCreateKey(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\MyKey",&hKey)) { printf("创建子键失败!\n"); return 0; } else { printf("创建子键成功!\n"); }
删
如果要把一个键删除,如删除上面创建的“HKEY_LOCAL_MACHINESOFTWARE\\Microsoft\\Windows\\MyKey”,直接调用RegDeleteKey,如下:
//删除键 if(ERROR_SUCCESS==RegDeleteKey(HKEY_LOCAL_MACHINE,L"SOFTWARE\\Microsoft\\Windows\\MyKey")) { printf("删除子键成功!\n"); } else { printf("删除子键失败!\n"); RegCloseKey(hKey); return 0; }
改
所谓的”改“,其实就是修改键中的值。或者创建一个键值。步骤分两步
1.打开要修改或者创建键值的项,如果要对一个键进行修改的操作首先一定要打开这个键,调用RegOpenKeyEx
2.调用RegSetValueExW设置要设置或者修改的键和它的值。
代码如下:
//修改键值 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKey,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS) { printf("创建HKEY失败!\n"); return 0; } if(RegSetValueExW(hKey,szValueName,0,REG_SZ,(const unsigned char *)szValueDate1,cbLen)==ERROR_SUCCESS) { printf("创建REG_SZ键值成功!\n"); } else { printf("创建REG_SZ键值失败!\n"); return 0; }
简单介绍下重要的参数。在RegOpenKeyEx中&hKey是函数运行后的输出值,表示被打开的键的句柄。句柄这种东西大家都懂的,windows里想操作什么,都要先抓到它的句柄。
在RegSetValueExW中,szValueName是键值的名字,相当于程序中的变量名,REG_SZ是键值的类型,szValueDate是键值的值,cbLen是这个键值的值的长度(毕竟一般这种值都是字符串)。
查
查主要有两种,1.对键中的某个键值的值有兴趣,调用RegQueryValueExW,2.对键的层次结构和它包含的子键有兴趣,用RegQueryInfoKey。
不过后面一个函数也能查值,很强大,它一执行,返回的是个结果的集合,里面包含被操作的键的所有直接键和这些键中的所有键值的名称。
首先第一种操作:
RegQueryValueExW(hKey,NULL,0,(LPDWORD)val,(BYTE *)result,dwSize);
上面的函数中hKey是已经被打开的键的句柄;
第二个参数我输入的是NULL,代表我想获得默认键值的值,如果要获得其他键值的值,就输入其他的名字;
第四个参数是要查询出的键值的类型;
第五个参数是查出的键值的值;
最后一个参数是这个值的长度。
第二种查询代码如下:
if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS) { printf("RegQueryInfoKey错误"); RegCloseKey(hKey); return 0; }
上面的函数中KeyCnt是被查的键的第一级子键数量;
KeyMaxLen在查到的子键中,名字最长的长度。。。;
NameCnt存放了被查的键的所有键值的名字;
NameMaxLen键值最大名称长度;
MaxDateLen在查到的键值的值中的最大长度;
这个函数其实不是独立使用的,一般还会有个后续操作,就是枚举该键的所有子键和键值,如下:
//枚举子键信息--------------------------------------------------------------- for(dwIndex=0;dwIndex<KeyCnt;dwIndex++) //枚举子键 { KeySize=KeyMaxLen+1; //因为RegQueryInfoKey得到的长度不包括0结束字符,所以应加1 szKeyName=(LPWSTR)malloc(KeySize); RegEnumKeyEx(hKey,dwIndex,szKeyName,&KeySize,NULL,NULL,NULL,NULL);//枚举子键 printf("%wZ\n",szKeyName); } //枚举键值信息--------------------------------------------------------------- for(dwIndex=0;dwIndex<NameCnt;dwIndex++) //枚举键值 { DateSize=MaxDateLen+1; NameSize=NameMaxLen+1; szValueName=(LPWSTR)malloc(NameSize); szValueDate=(LPBYTE)malloc(DateSize); RegEnumValue(hKey,dwIndex,szValueName,&NameSize,NULL,&Type,szValueDate,&DateSize);//读取键值 if(Type==REG_SZ) { ///*判断键值项类型并做其它操作......*/ printf("%s\n",szValueName); } if(Type==REG_DWORD) { } }
关闭键
最后出门都不能忘了随手关门,用完了键当然也不能忘了关闭键:RegCloseKey(hKey);
附:注册表编程实例
1.修改注册表实现指定的后缀名和默认打开程序的绑定/article/1847951.html
2.根据给定文件名的后缀,查询注册表,创建进程用注册表中记录的默认方式打开目标文件/article/1847952.html
技术相关更多文章猛击:哇啦天堂论坛技术区
相关文章推荐
- Excel 2003对象模型编程快速入门
- 一天掌握Android JNI本地编程 快速入门
- ASP.NET数据库编程快速入门之技术慨述
- Excel 2003对象模型编程快速入门
- Java泛型编程快速入门
- Python核心编程笔记-第2章:快速入门
- Java加密和数字签名编程快速入门
- Java基础:Java泛型编程快速入门
- Java泛型编程快速入门
- Java基础:Java泛型编程快速入门
- JAVA基础:Java泛型编程快速入门
- Java泛型编程快速入门
- Java加密和数字签名编程快速入门
- socket 网络编程快速入门(二)教你编写基于UDP/TCP的服务端多线程通信
- Linux Shell编程快速入门
- ExcelVBA编程系列之对象模型(1):Excel 2003对象模型编程快速入门
- 《iPhone 3D 编程》第一章:快速入门指南
- CUDA编程快速入门
- Java加密和数字签名编程快速入门
- HTML编程快速入门教程