轉自 http://blog.csdn.net/pbymw8iwm/article/details/6931946
1.簡介
CRegKey提供了對系統注冊表的操作方法,通過CRegKey類,可以方便的打開注冊表的某個分支或子鍵(CRegKey::Open),可以方便的修改一個鍵的鍵值(CRegKey::SetValue),也可以查詢某個鍵的鍵值(CRegKey::QueryValue),操作完成之后,可以關閉子鍵(CRegKey::Close)。
要想使用CRegKey類,需要包含頭文件atlbase.h
2.常用操作方法
1) 打開需要查詢或修改的注冊表鍵
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
hKeyParent參數指定了待打開的注冊表鍵的句柄,常用的可選值為
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
以上四個值分別代表了注冊表中最主要的四個分支;
lpszKeyName參數指定了在hKeyParent下需要打開的項的名字;
samDesired參數指定了打開該項后所擁有的權限,默認為KEY_ALL_ACCESS,表示擁有對該分支的所有操作權,包括讀和寫等。
舉例:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows") != ERROR_SUCCESS)
3: {
4: AfxMessageBox("Error open reg key!!");
5: }
2) 查詢注冊表項中的某個鍵的鍵值
LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
查詢鍵值提供了兩種形式,分別用來獲取數值類型的值和字符串類型的值。在上面的形式中,第一種用於獲取數值類型的值,第二種用於獲取字符串類型的值。
lpszValueName參數用來指定鍵的名稱,dwValue和szValue用於保存鍵值,而pdwCount用來控制獲取到的字符串值的長度
舉例:
比如,假設要獲得windowx系統默認的桌面壁紙的搜索路徑,由於這個路徑保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion這一項的WallPaperDir鍵內,如下圖
所以,可以用以下的代碼來實現:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion") != ERROR_SUCCESS)
3: AfxMessageBox("Error open reg key!!!");
4: else
5: {
6: char szPath[MAX_PATH];
7: DWORD dwLen = myKey.QueryValue(szPath, "WallPaperDir", MAX_PATH);
8: }
另外,如果我們想查詢某個項的默認鍵值該怎么辦呢?只需要將lpszValueName參數寫為空字符串就好了。比如現在想看一下.txt類型的文件的關聯程序是誰,我們需要首先在HKEY_CLASSES_ROOT下找到.txt項,然后看它的默認鍵值是多少:
示例代碼如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CLASSES_ROOT, ".txt") != ERROR_SUCCESS)
3: AfxMessageBox("Error open key!!!");
4: else
5: {
6: char szFileType[255];
7: DWORD dwLen = myKey.QueryValue(szFileType, "", sizeof(szFileType));
8: }
3) 添加或修改鍵值
LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );
LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
添加鍵值函數提供了三種形式,前兩種分別用來向當前已經打開的這個項中添加DWORD類型的鍵、字符串類型的鍵,最后一種形式的函數,可以在某個特定的分支線下的某個特定的項內添加一個鍵。如果lpszKeyName指定的鍵不存在,則添加這個鍵,否則,就是修改已經存在的鍵的鍵值。另外需要注意的是,最后一種形式的SetValue函數,如果lpszKeyName所指定的項不存在,則SetValue函數會返回錯誤,而不會添加一個項。
示例,比如現在要給IE的工具欄設置一個背景圖片,可以在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Toolbar項下面新建一個BackBitmap的字符串鍵,並制定背景圖片的位置,代碼如下:
1: CRegKey myKey;
2: if(myKey.Open(HKEY_CURRENT_USER, "Software//Microsoft//Internet Explorer//Toolbar") != ERROR_SUCCESS)
3: AfxMessageBox("error open reg key!!!");
4: else
5: {
6: myKey.SetValue("C://WINDOWS//Web//Wallpaper//Bliss.bmp", "BackBitmap");
7: }
這樣,IE的背景圖片就被設置成了C:/WINDOWS/Web/Wallpaper/Bliss.bmp
4) 刪除鍵值
LONG DeleteValue( LPCTSTR lpszValue );
這個函數比較簡單,它會刪除lpszValue參數指定的鍵。
5) 新建項
LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORDlpdwDisposition = NULL );
Create函數用於創建一個項,它可以在hKeyParent指定的分支下,創建一個名為lpszKeyName的項,后面幾個參數一般用默認的即可。
比如,現在要建立一個新的文件類型.spj的關聯方式,首先需要在HKEY_CLASSES_ROOT下建立一個名為.spj的項,代碼如下:
1: CRegKey myKey;
2: if(myKey.Create(HKEY_CLASSES_ROOT, ".spj") != ERROR_SUCCESS)
3: AfxMessageBox("error create key!!!");
4: else
5: AfxMessageBox("create key ok!");
6) 刪除項
LONG DeleteSubKey( LPCTSTR lpszSubKey );
該函數可以刪除名為lpszSubKey的項,以及該項下的所有的鍵。注意,被刪除的項不能含有子項!可以通過另外一個函數LONG RecurseDeleteKey( LPCTSTR lpszKey );刪除某個項以及該項下的所有內容。
7) 關閉注冊表
LONG Close( );
關閉注冊表時,之前所做的修改才會被保存到硬盤。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函數在需要的時候將所做的修改及時寫入硬盤。
{
AfxMessageBox("Successful!");
rk.Close();
}
if(rk.DeleteSubKey("4")==ERROR_SUCCESS)
{
AfxMessageBox("sucess!");
}
DWORD CTools::ReadReg(char *szName,LPCTSTRszValue)
{//szName這個注冊表名。 把值存到szValue。
DWORD dwRes=1;
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
g_szFullKey,
NULL,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
return FALSE;
DWORDdwType,dwLen=SHORT_LEN;
if(RegQueryValueEx(hKey,szName,NULL,&dwType,(BYTE*)szValue,&dwLen)!=ERROR_SUCCESS)
dwRes=0;
if(RegCloseKey(hKey)!=ERROR_SUCCESS)
dwRes=0;
return dwRes;
}