註冊表編程快速入門

最近涉及到了一些註冊表的編程,就把入門的一些東西整理一下,各位註冊表新手一起來討論討論。歡迎留言!

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

 技術相關更多文章猛擊:哇啦天堂論壇技術區

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章