您的位置:首页 > 编程语言

注册表编程快速入门

2012-08-07 16:45 232 查看
最近涉及到了一些注册表的编程,就把入门的一些东西整理一下,各位注册表新手一起来讨论讨论。欢迎留言!

文本的完整代码在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

技术相关更多文章猛击:哇啦天堂论坛技术区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: