CRegKey 注冊表操作 轉


轉自 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 ); 函數在需要的時候將所做的修改及時寫入硬盤。 

8

CRegkey::Creat(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):  創建新的key.
一般只用添加前兩個值。
CRegKey::SetValue(DWORD  dwValue , LPCTSTR lpszValueName); 設置值。
CRegKey::SetValue(LPCTSTR  lpszKeyName , LPCTSTR lpszValue , LPCTSTR lpszValueName);在當前打開的文件夾下在設置個lpszKeyName文件夾,名是lpszValueName的數據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的下面創建XZX\\4路徑,4下面有名是name的數據123。                                                       CRegKey::Open(HKEY hKeyParent , LPCTSTR lpszKeyName , REGSAM samDesired  =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!");
   }
   注意:打開要刪除的父文件夾,並且刪除的文件下面沒有值。
另一種方法:

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;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM