最近涉及到了一些注册表的编程,就把入门的一些东西整理一下,各位注册表新手一起来讨论讨论。欢迎留言!
文本的完整代码在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.修改注册表实现指定的后缀名和默认打开程序的绑定http://blog.csdn.net/arvon2012/article/details/7839556
2.根据给定文件名的后缀,查询注册表,创建进程用注册表中记录的默认方式打开目标文件http://blog.csdn.net/arvon2012/article/details/7839363
技术相关更多文章猛击:哇啦天堂论坛技术区