最近涉及到了一些註冊表的編程,就把入門的一些東西整理一下,各位註冊表新手一起來討論討論。歡迎留言!
文本的完整代碼在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
技術相關更多文章猛擊:哇啦天堂論壇技術區