CRegKey 注册表操作
1.簡介
CRegKey提供了對(duì)系統(tǒng)注冊(cè)表的操作方法,通過CRegKey類,可以方便的打開注冊(cè)表的某個(gè)分支或子鍵(CRegKey::Open),可以方便的修改一個(gè)鍵的鍵值(CRegKey::SetValue),也可以查詢某個(gè)鍵的鍵值(CRegKey::QueryValue),操作完成之后,可以關(guān)閉子鍵(CRegKey::Close)。
要想使用CRegKey類,需要包含頭文件atlbase.h
2.常用操作方法
1) 打開需要查詢或修改的注冊(cè)表鍵
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
hKeyParent參數(shù)指定了待打開的注冊(cè)表鍵的句柄,常用的可選值為
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
以上四個(gè)值分別代表了注冊(cè)表中最主要的四個(gè)分支;
lpszKeyName參數(shù)指定了在hKeyParent下需要打開的項(xiàng)的名字;
samDesired參數(shù)指定了打開該項(xiàng)后所擁有的權(quán)限,默認(rèn)為KEY_ALL_ACCESS,表示擁有對(duì)該分支的所有操作權(quán),包括讀和寫等。
?
舉例:
1: CRegKey myKey; 2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows") != ERROR_SUCCESS) 3: { 4: AfxMessageBox("Error open reg key!!"); 5: }?
2) 查詢注冊(cè)表項(xiàng)中的某個(gè)鍵的鍵值
LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );
LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )
查詢鍵值提供了兩種形式,分別用來獲取數(shù)值類型的值和字符串類型的值。在上面的形式中,第一種用于獲取數(shù)值類型的值,第二種用于獲取字符串類型的值。
lpszValueName參數(shù)用來指定鍵的名稱,dwValue和szValue用于保存鍵值,而pdwCount用來控制獲取到的字符串值的長度
?
舉例:
比如,假設(shè)要獲得windowx系統(tǒng)默認(rèn)的桌面壁紙的搜索路徑,由于這個(gè)路徑保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion這一項(xiàng)的WallPaperDir鍵內(nèi),如下圖
所以,可以用以下的代碼來實(shí)現(xiàn):
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: }另外,如果我們想查詢某個(gè)項(xiàng)的默認(rèn)鍵值該怎么辦呢?只需要將lpszValueName參數(shù)寫為空字符串就好了。比如現(xiàn)在想看一下.txt類型的文件的關(guān)聯(lián)程序是誰,我們需要首先在HKEY_CLASSES_ROOT下找到.txt項(xiàng),然后看它的默認(rèn)鍵值是多少:
示例代碼如下:
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 );
添加鍵值函數(shù)提供了三種形式,前兩種分別用來向當(dāng)前已經(jīng)打開的這個(gè)項(xiàng)中添加DWORD類型的鍵、字符串類型的鍵,最后一種形式的函數(shù),可以在某個(gè)特定的分支線下的某個(gè)特定的項(xiàng)內(nèi)添加一個(gè)鍵。如果lpszKeyName指定的鍵不存在,則添加這個(gè)鍵,否則,就是修改已經(jīng)存在的鍵的鍵值。另外需要注意的是,最后一種形式的SetValue函數(shù),如果lpszKeyName所指定的項(xiàng)不存在,則SetValue函數(shù)會(huì)返回錯(cuò)誤,而不會(huì)添加一個(gè)項(xiàng)。
示例,比如現(xiàn)在要給IE的工具欄設(shè)置一個(gè)背景圖片,可以在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Toolbar項(xiàng)下面新建一個(gè)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的背景圖片就被設(shè)置成了C:/WINDOWS/Web/Wallpaper/Bliss.bmp
4) 刪除鍵值
LONG DeleteValue( LPCTSTR lpszValue );
這個(gè)函數(shù)比較簡單,它會(huì)刪除lpszValue參數(shù)指定的鍵。
?
5) 新建項(xiàng)
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, LPDWORD lpdwDisposition = NULL );
Create函數(shù)用于創(chuàng)建一個(gè)項(xiàng),它可以在hKeyParent指定的分支下,創(chuàng)建一個(gè)名為lpszKeyName的項(xiàng),后面幾個(gè)參數(shù)一般用默認(rèn)的即可。
比如,現(xiàn)在要建立一個(gè)新的文件類型.spj的關(guān)聯(lián)方式,首先需要在HKEY_CLASSES_ROOT下建立一個(gè)名為.spj的項(xiàng),代碼如下:
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) 刪除項(xiàng)
LONG DeleteSubKey( LPCTSTR lpszSubKey );
該函數(shù)可以刪除名為lpszSubKey的項(xiàng),以及該項(xiàng)下的所有的鍵。注意,被刪除的項(xiàng)不能含有子項(xiàng)!可以通過另外一個(gè)函數(shù)LONG RecurseDeleteKey( LPCTSTR lpszKey );刪除某個(gè)項(xiàng)以及該項(xiàng)下的所有內(nèi)容。
?
7) 關(guān)閉注冊(cè)表
LONG Close( );
關(guān)閉注冊(cè)表時(shí),之前所做的修改才會(huì)被保存到硬盤。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函數(shù)在需要的時(shí)候?qū)⑺龅男薷募皶r(shí)寫入硬盤。?
8
CRegkey::Creat(HKEY hKeyParent, LPCTSTRlpszKeyName, LPTSTRlpszClass = REG_NONE,DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAMsamDesired= KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTESlpSecAttr = NULL, LPDWORD lpdwDisposition =NULL):? 創(chuàng)建新的key. 一般只用添加前兩個(gè)值。 CRegKey::SetValue(DWORD dwValue, LPCTSTRlpszValueName); 設(shè)置值。 CRegKey::SetValue(LPCTSTR lpszKeyName, LPCTSTRlpszValue, LPCTSTRlpszValueName);在當(dāng)前打開的文件夾下在設(shè)置個(gè)lpszKeyName文件夾,名是lpszValueName的數(shù)據(jù)lpszValue。 例如:CRegKey rKey; ????if(rKey.Creat(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS) ??????if(rk.SetValue(123,"name")==ERROR_SUCCESS)
???????{
???????AfxMessageBox("Successful!");
????????rk.Close();
?????????} remark:在根為?HKEY_CURRENT_USER的下面創(chuàng)建XZX\\4路徑,4下面有名是name的數(shù)據(jù)123。???????????????????????????????????????????????????????CRegKey::Open(HKEYhKeyParent, LPCTSTRlpszKeyName, REGSAMsamDesired =KEY_ALL_ACCESS);???打開路徑。 CRegKey::DeleteValue(LPCTSTR lpszValue):刪除打開路徑下邊的值。 例如:if(rKey.Open(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS) ???????if(rKey.DeleteValue("name")==ERROR_SUCESS) ????????AfxMessageBox("CreatSucessful!!?"); ????????rKey.Close(); CRegKey::DeleteSubKey(LPCTSTR lpszSubKey):刪除SubKey。 例如? if(rk.Open(HKEY_CURRENT_USER,"XZX")==ERROR_SUCCESS)
??? if(rk.DeleteSubKey("4")==ERROR_SUCCESS)
??? {
????AfxMessageBox("sucess!");
???} ?注意:打開要?jiǎng)h除的父文件夾,并且刪除的文件下面沒有值。 另一種方法: DWORD CTools::ReadReg(char *szName,LPCTSTRszValue)
{//szName這個(gè)注冊(cè)表名。?把值存到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;
}
總結(jié)
以上是生活随笔為你收集整理的CRegKey 注册表操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++(STL):26 ---关联式容器
- 下一篇: TensorFlow(3)-与训练相关的