regopenkeyex用法


在程序中使用注冊表,不外乎創建、打開、讀取、設置、刪除這五個常規操作

一、 創建鍵RegCreateKeyEx

通過RegCreateKeyEx函數可以在注冊表中創建鍵,如果需要創建的鍵已經存在了,則打開鍵。函數原型如下:

LONG RegCreateKeyEx(
  HKEY hKey,
  LPCTSTR lpSubKey,
  DWORD Reserved,
  LPTSTR lpClass,
  DWORD dwOptions,
  REGSAM samDesired,
  LPSECURITY_ATTRIBUTESlpSecurityAttributes,
  PHKEY phkResult,
  LPDWORD lpdwDisposition
  );

各參數及返回值的含義如下:
  hKey為主鍵值,可以取下面的一些數值:
  HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG
  HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE
  HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系統)
  HKEY_DYN_DATA(WIN9X操作系統)
  參數lpSubKey為一個指向以零結尾的字符串的指針,其中包含將要創建或打開的子鍵的名稱。子鍵不可以用反斜線()開始。該參數可以為NULL。
  Reserved保留,必須設置為0。
  參數lpClass一個指向包含鍵類型的字符串。如果該鍵已經存在,則忽略該參數。
  參數dwOptions為新創建的鍵設置一定的屬性。可以取下面的一些數值:
  REG_OPTION_NON_VOLATILE 新創建的鍵為一個非短暫性的鍵(數據信息保存在文件中,當系統重新啟動時,數據信息恢復)
  REG_OPTION_VOLATILE 新創建的鍵為一個短暫性的鍵(數據信息保存在內存中)。Windows95忽略該數值。
  REG_OPTION_BACKUP_RESTORE 僅在WINNT中支持,可以提供優先級支持。
  參數samDesired用來設置對鍵訪問的權限,可以取下面的一些數值:
  KEY_CREATE_LINK 准許生成符號鍵
  KEY_CREATE_SUB_KEY 准許生成子鍵
  KEY_ENUMERATE_SUB_KEYS 准許生成枚舉子鍵
  KEY_EXECUTE 准許進行讀操作
  KEY_NOTIFY 准許更換通告
  KEY_QUERY_VALUE 准許查詢子鍵
  KEY_ALL_ACCESS 提供完全訪問,是上面數值的組合
  KEY_READ 是下面數值的組合:
  KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY
  KEY_SET_VALUE 准許設置子鍵的數值
  KEY_WRITE 是下面數值的組合:
  KEY_SET_VALUE、KEY_CREATE_SUB_KEY
  參數lpSecurityAttributes為一個指向SECURITY_ATTRIBUTES結構的指針,確定返回的句柄是否被子處理過程繼承。如果該參數為NULL,則句柄不可以被繼承。在WINNT中,該參數可以為新創建的鍵增加安全的描述。
  參數phkResult為一個指向新創建或打開的鍵的句柄的指針。
  參數lpdwDispition指明鍵是被創建還是被打開的,可以是下面的一些數值:
  REG_CREATE_NEW_KEY 鍵先前不存在,現在被創建。
  REG_OPENED_EXISTING_KEY 鍵先前已存在,現在被打開。
  返回值 如果函數調用成功,則返回ERROR_SUCCESS。否則,返回值為文件WINERROR.h中定義的一個非零的錯誤代碼,可以通過設置FORMAT_MESSAGE_FROM_SYSTEM標識調用FormatMessage函數來獲取一個對錯誤的總體描述。
二、 打開一個鍵RegOpenKeyEx

RegOpenKeyEx函數可以打開一個指定的鍵,函數原型如下:

LONG RegOpenKeyEx(
  HKEY hkey,
  LPCTSTR lpSubKey,
  DWORD ulOption,
  REGSAM samDesired,
  PHKEY phkResult
  );

各參數及返回值的含義如下:
  參數hKey的含義同RegCreateKeyEx函數中的hKey參數。
  參數lpSubKey為一個指向以零結尾的字符串的指針,其中包含子鍵的名稱,可以利用反斜線()分隔不同的子鍵名。如果字符串為空,則根據hKey參數創建一個新的句柄。在這種情況下,並不關閉先前打開的句柄。
  ulOption保留,通常必須設置為0。
  參數samDesired的含義同RegCreateKeyEx函數中的samDesired參數。
  參數phkResult為一個指針,用來指向打開的鍵的句柄。可以通過RegCloseKey函數關閉這個句柄。
  返回值同RegCreateKeyEx函數的返回值。

三、 讀取鍵RegQueryValueEx

通過RegQueryValueEx函數可以從一個已經打開的鍵中讀取數據,函數原型如下:

LONG RegQueryValueEx(
  HKEY hKey,
  LPTSTR lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE lpData,
  LPDWORD lpcbData
  );

各個參數及返回值的含義如下:
  參數hKey為當前的一個打開的鍵的句柄,具體數值同RegCreateKeyEx函數的hKey參數。
  參數lpVauleName為一個指向非空的包含查詢值的名稱的字符串指針。
  lpReserved保留,必須為NULL。
  參數lpType為一個指向數據類型的指針,數據類型為下列類型之一:
  REG_BINARY 二進制數據
  REG_DWORD 32位整數
  REG_DWORD_LITTLE_ENDIAN little-endian格式的數據,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存
  REG_DWORD_BIG_ENDIAN big-endian格式的數據,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存
  REG_EXPAND_SZ 一個包含未擴展環境變量的字符串
  REG_LINK 一個Unicode類型的鏈接
  REG_MULIT_SZ 以兩個零結尾的字符串
  REG_NONE 無類型數值
  REG_RESOURCE_LIST 設備驅動資源列表
  REG_SZ 一個以零結尾的字符串根據函數使用的字符集類型的不同而設置為Unicode或ANSI類型的字符串
  參數lpData為一個指向保存返回值的變量的指針。如果不需要返回值,該參數可以為NULL。
  參數lpcbData為一個指向保存返回值長度的變量的指針。其中長度以字節為單位。如果數據類型為REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么長度也包括結尾的零字符,只有在參數lpData為NULL時,參數lpcbData才可以為NULL。

  返回值同RegCreateKeyEx函數的返回值

四、 設置鍵值RegSetValueEx

RegSetValueEx函數可以設置注冊表中鍵的值,函數原型如下:

LONG RegSetValueEx(
  HKEY hKey,
  LPCTSTR lpValueName,
  DWORD Reserved,
  DWORD dwType,
  CONST BYTE *lpData,
  DWORD cbData
  );

各個參數及返回值的含義如下:
  參數hKey的含義同RegCreateKeyEx函數中的hKey參數。
  參數lpValueName為一個指向包含值名的字符串指針。
  Reserved保留,通常必須設置為0。
  參數dwType確定了設置的值的類型同RegQueryValueKeyEx的lyType參數。
  參數lpData為一個指向包含數據的緩沖區的指針。
  參數cbData以字節為單位,指定數據的長度。
  返回值同RegCreateKeyEx函數的返回值。
  五、 刪除鍵值RegDeketeKey
  函數RegDeketeKey刪除一個鍵及所有的子鍵。函數原型如下:
  

LONG RegDeleteKey(
  HKEY hKey,
  LPCTSTR lpSubKEY
  );

 


  各個參數及返回值的含義如下:
  參數hKey的含義同RegCreateKeyEx函數中的hKey參數。
  參數lpSubKey的含義同RegCreateKeyEx函數中的lpSubKey參數。

六、 示例

下面我們在Visual C++6.0或5.0環境中新建一基於對話框的工程。設置兩個命令按鈕,名為“查詢用戶信息”和“修改用戶信息”,用來查詢和修改注冊表中的用戶姓名和公司名稱。需要說明的是,用戶的信息位於系統注冊表中KEY-CURRENT-USERSoftwareMicrsoftMS Setup(ACME)User Info的位置,鍵值名DefName和DefCompany分別表示用戶的姓名和用戶公司的名稱。

1、 查詢用戶信息的代碼

HKEY hKey; //定義有關的hKey,在查詢結束時要關閉。
  LPCTSTR path="Software\Micrsoft\MS Setup(ACME)\User Info\”;
  LONG return0=(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_READ,&hKey));
  if(return0!=ERROR_SUCCESS)
  {
  MessageBox("錯誤:無法打開有關的鍵!");
  Return;
  }
  LPBYTE username_Get=new BYTE[80];
  DWORD type_1=REG_SZ;
  DWORD cbData_1=80;
  LONG return1=::RegQueryValueEx(hKey,"Defname:,NULL,&type_1,
  username_Get,&cbData_1);
  if(return1!=ERROR_SUCCESS)
  {
  MessageBox("錯誤:無法查詢有關注冊表信息!");
  Return;
  }
  LPBYTE company_Get=new BYTE[80];
  DWORD type_2=REG_SZ;
  DWORD cbData_2=80;
  LONG return2=::RegQueryValueEx(hKey,"DefCompany",NULL,&type_2,
  company_Get,&cbData_2);
  if(return2!=ERROR_SUCCESS)
  {
  MessageBox("錯誤:無法查詢有關注冊表信息!");
  Return;
  }
  //將username_Get和company_Get轉換為CString字符串,以便顯示輸出
  CString str_username=CString(username_Get);
  CString str_company=CString(company_Get);
  delete[] username_Get;
  delete[] company_Get;
  //程序結束前關閉已經打開的hKey
  ::RegCloseKey(hKey);
  

字符串str_username和str_company表示查詢的用戶的姓名和公司的名稱。
  2、修改用戶信息的代碼
  因用戶輸出的是CString類型的字符串,要先將其轉換為LPBYTE類型,以便以后函數的調用。下面是轉換函數:

LPBYTE CString_To_LPBYTE(CString str)
  {
  LPBYTE lpb=new BYTE [str.GetLength( )+1];
  for(int i=0;i<STR. GetLength( );i++)lpb[i]="str[i];
  lpb[str.GetLength( )]=0;
  return lpb;
  }
  以下是具體的修改注冊表用戶信息的代碼:
  CString str_username,str_company;
  HKEY hKey;
  LPCTSTR path=“Software\Micrsoft\MS Setup(ACME)\User Info\”;
  LONG return0(::RegOpenKeyEx(HKEY_CURRENT_USER,path,0,KEY_WRITE,&hKey));
  if(return0!=ERROR_SUCCESS)
  {
  MessageBox(“錯誤:無法打開有關的鍵!”);
  return;
  }
  LPBYTE username_Set=Cstring_To_LPBYTE(str_username);
  DWORD type_1=REG_SZ;
  DWORD cbData_1=str_username.GetLength( )+1;
  LONG return1=::RegSetalueEx(hKey," DefName?,NULL,type_1,username_Set,cbData_1);
  if (return1!=ERROR_SUCCESS)
  {
  MessageBox(“錯誤:無法修改有關注冊表信息!”);
  return;
  }
  LPBYTE company_Set=Cstring_To_LPBYTE(str_company);
  DWORD type_2=REG_SZ;
  DWORD cbData_2=str_COMPANY.GetLength( )+1;
  LONG return2=::RegSetalueEx(hKey,"DefCompany",NULL,type_2,company_Set,cbData_2);
  if (return2!=ERROR_SUCCESS)
  {
  MessageBox(“錯誤:無法修改有關注冊表信息!”);
  return;
  }

 


免責聲明!

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



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