有關註冊表API函數

 註冊表的操作,API爲我們提供了大約25個函數。他提供了對註冊表的讀取,寫入,刪除,以及打開註冊表及鍵值時所有函數,並且可以達到對註冊表的備份,連接和對遠端註冊表進行查看等等。註冊表對整個系統十分重要,你在進行操作時,一定要先考慮清楚。這些函數有: 
RegCloseKey RegConnectRegistry  RegCreateKey  RegCreateKeyEx  RegDeleteKey  RegDeleteVale  
RegEnumKey  RegFlushKey  RegGetKeySecurity(此函數,98不適用)  RegLoadKey 
RegNotifyChangeKeyValue(98不適用)  RegOpenKey  RegOpenKeyEx  RegQueryInfoKey  RegQueryValue 
RegQueryValueEx  RegReplaceKey  RegRestoreKey(98不適用) RegSaveKey  RegSetKeySecurity(98不適用)   RegSetValue  RegSetValueEx  RegUnLoadKey  
  我們對經常使用的幾個函數進行介紹。 
  1·RegClose() 
  原形:LONG RegCloseKey( 
  HKEY hKey  // 釋放已經打開的註冊表句柄 
     ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:關閉指定的主冊表鍵,釋放句柄。當對一個或多個鍵或值操作完成以後,需要關閉其鍵來進行保存操作結果。關閉一個鍵後,句柄變爲非法,以使其不可再次被使用。爲系統重新使用而釋放句柄。 
  例子 
BOOL bRet = TRUE; 
if( m_hKey == NULL ) 
  return( FALSE ); 
bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS ); 
m_hKey = NULL; 
return( bRet ); 

  2·RegCreateKeyEx()和RegCreateKey() 
  原形:LONG RegCreateKeyEx( 
        HKEY hKey,        // 主鍵名稱 
        LPCTSTR lpSubKey,     // 子鍵名稱或路徑 
        DWORD Reserved,      // 保留,爲0 
        LPTSTR lpClass,      // 沒弄懂,我設爲空也差不多 
        DWORD dwOptions,      
             /* 對你建立的鍵的一些選項,可以是這些值:REG_OPTION_NON_VOLATILE,REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE第一個是默認的了。一般用第一個就可以了。*/ 
        REGSAM samDesired,    // 設置你對你建立的這個鍵的訪問權限 
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
             //不太明白 
        PHKEY phkResult,     // 指向你建的句柄 
        LPDWORD lpdwDisposition  //用來查看是打開一個已經有的鍵,還是新建了鍵 
      ); 
  RegCreateKey()函數簡單了不少,請自己看了。 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS. 
  解釋:打開指定的鍵或子鍵。如果要打開的鍵不存在的話,本函數會試圖建立它。當在創建或打開註冊表的鍵時,需要指定訪問權限,而這些訪問權限需要到一級。默認的權限是KEY_ALL_ACCESS權限。還有KEY_CREATE_LINK創建字符鏈權限,KEY_CREATE_SUB_KEY創建子鍵權限,KEY_EXECUTE讀取鍵權限,KEY_NOTIFY獲得修改鍵通知的權限,KEY_QUERY_VALUE查詢鍵值的權限,KEY_SET_VALUE設置數據值的權限。注意不能在根一級建鍵,在註冊表的根一級僅可有預定義的鍵。具體使用,請查看聯機手冊。 
例子: 
   HKEY m_hkey; 
   DWORD dwDisposition; 
   long ret0=(::RegCreateKeyEx 
      (HKEY_CURRENT_USER,"REGD//",0,NULL, 
      REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hkey,&dwDisposition)); 
   if(ret0!=ERROR_SUCCESS) //如果無法打開hKEY,則終止程序的執行 
   { 
      MessageBox("錯誤: 無法打開有關的hKEY!"); 
      return; 
   } 
   if(dwDisposition==REG_OPENED_EXISTING_KEY) 
      MessageBox("打開了一個已經存在的鍵"); 
   else 
   { 
     if(dwDisposition==REG_CREATED_NEW_KEY) 
        MessageBox("建立一個新鍵"); 
   } 
   RegClosekey(m_hkey); 

  3·RegOpenKey()和RegOpenKeyEx() 
  原形:LONG RegOpenKeyEx( 
        HKEY hKey,     // 要打開主鍵名 
        LPCTSTR lpSubKey, // 子鍵或路徑 
        DWORD ulOptions,  // 保留,爲0 
        REGSAM samDesired, // 操作權限標誌 
        PHKEY phkResult  // 指向你打開鍵的句柄 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS. 
  解釋:該函數負責打開指定的鍵或子鍵,如果不存在他不建立。其他和RegCreateKeyEx()和RegCreateKey()基本相同。 

  4·RegDeleteKey() 
  原形:LONG RegDeleteKey( 
        HKEY hKey,     // 已打開的鍵的句柄 
        LPCTSTR lpSubKey  // 要刪除的子鍵或路徑,傳如""將刪除key本身 
       ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  該函數用來刪除註冊表中的一個鍵值的。在用此函數時需要注意98與NT的差異。在NT中在刪除一個鍵之前,要求必須刪除所有子鍵,需要從下向上遞歸刪除所有子鍵,而WINDOWS98沒有他那麼複雜,只要刪除鍵及其所有子鍵就可以啦。 

  5·RegQueryValue()和RegQueryValueEx() 
  原形:LONG RegQueryValueEx( 
        HKEY hKey,      // 已打開的鍵的句柄 
        LPTSTR lpValueName, // 要查詢值的名稱,傳如""爲查詢鍵下的默認值 
        LPDWORD lpReserved, // 保留,爲0 
        LPDWORD lpType,   // 查詢的類型 
        LPBYTE lpData,    // 數據存放的地址 
        LPDWORD lpcbData   // 數據長度+1 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:讀取某子鍵下特定名稱的值。 
  例子 
   CString m_strQ;//用來存放查詢來的字符串值 
   DWORD m_dwCount;//記錄字符串的長度+1(包括NULL字符) 
   ::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&m_dwCount);//先查詢出字節空間  
   ret1=(::RegQueryValueEx 
        (m_hkey,"",0,NULL,(unsigned char *)m_strQ.GetBuffer(m_dwCount),&m_kk)); 
   m_strQ.ReleaseBuffer(); 
   MessageBox(m_strQ); 

  6·RegSetValue()和RegSetValueEX() 
  原形:LONG RegSetValueEx( 
        HKEY hKey,      // 已打開的鍵的句柄 
        LPCTSTR lpValueName, // 要查詢值的名稱,傳如""爲查詢鍵下的默認值 
        DWORD Reserved,   // 保留 
        DWORD dwType,    // 變量的類型 
        CONST BYTE *lpData, // 變量數據的地址 
        DWORD cbData     // 變量的長度 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:設置某子鍵下特定名稱的值。 

  7·RegEnumValue() 
  原形:LONG RegEnumValue( 
        HKEY hKey,       // 要查詢的已打開的鍵的句柄 
        DWORD dwIndex,     // 讀取名稱的索引號 
        LPTSTR lpValueName,   // 返回所讀取的名稱 
        LPDWORD lpcbValueName, // 返回讀取名稱的長度,不含chr(0) 
        LPDWORD lpReserved,   // 保留,爲0 
        LPDWORD lpType,     // 返回所讀取的數據類型 
        LPBYTE lpData,     // 返回所讀取的數據 
        LPDWORD lpcbData    // 返回所讀取的數據長度 
     ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:列出某Key的所有名稱的值,變化索引即可遍歷整個鍵下的名稱和數據。 

  8·RegDeleteValue() 
  原形:LONG RegDeleteValue( 
        HKEY hKey,      // 要刪除的鍵的句柄 
        LPCTSTR lpValueName  // 要刪除的名稱 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:刪除某Key的某一名稱 

  9·RegEnumKey()和RegEnumKeyEx() 
  原形:LONG RegEnumKeyEx( 
        HKEY hKey,     // 要列舉的鍵的句柄 
        DWORD dwIndex,   // 索引 
        LPTSTR lpName,   // 子鍵的名稱 
        LPDWORD lpcbName,  // 子鍵名稱的長度 
        LPDWORD lpReserved, // 保留 
        LPTSTR lpClass,   // address of buffer for class string 
        LPDWORD lpcbClass, // address for size of class buffer 
        PFILETIME lpftLastWriteTime 
           // address for time key last written to 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  返回註冊表鍵及其子鍵的詳細信息。 

  10·RegQueryInfoKey() 
  原形:LONG RegQueryInfoKey( 
        HKEY hKey,        // 已打開的鍵的句柄 
        LPTSTR lpClass,      // 類型名稱,僅使用於NT。若不使用則傳入Null 
        LPDWORD lpcbClass,    // 類型名稱的長度 
        LPDWORD lpReserved,    // 保留 
        LPDWORD lpcSubKeys,    // 返回子鍵的數目               
        LPDWORD lpcbMaxSubKeyLen, // 返回最長的子鍵長度               
        LPDWORD lpcbMaxClassLen, // 返回最長的類長度 
        LPDWORD lpcValues,    // 返回值的數目               
        LPDWORD lpcbMaxValueNameLen, // 返回最長的值項名稱的長度 
        LPDWORD lpcbMaxValueLen, // 返回最長的值的長度 
        LPDWORD lpcbSecurityDescriptor, //返回安全描述,僅適用於 NT 
        PFILETIME lpftLastWriteTime  // 返回鍵最後被寫入的時間,僅適用於 NT 
     ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:返回註冊表鍵的信息,包括類名、子鍵數量、最長子鍵名、值的數量、最長值數據、安全描述符的長度以及上一次寫入的時間等。 

  11·RegLoadKey() 
  原形:LONG RegLoadKey( 
        HKEY hKey,    // 打開的句柄 
        LPCTSTR lpSubKey, //子鍵的路徑          
        LPCTSTR lpFile  // 要寫入註冊表信息的文件 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:從指定的文件恢復註冊表鍵的子鍵信息到註冊表。 

  12·RegReplaceKey() 
  原形:LONG RegReplaceKey( 
        HKEY hKey,     // handle to open key 
        LPCTSTR lpSubKey, // address of name of subkey 
        LPCTSTR lpNewFile, // 在替換前生成新的備份文件 
        LPCTSTR lpOldFile // 需要覆蓋上註冊表的文件 
      ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:從指定的文件恢復註冊表鍵的子鍵信息到註冊表並替換原有的值,並生成新的備份文件 

  13· RegSaveKey() 
  LONG RegSaveKey( 
     HKEY hKey,    // 要保存的句柄 
     LPCTSTR lpFile, // 保存子鍵的文件 
     LPSECURITY_ATTRIBUTES lpSecurityAttributes    //不太懂          
    ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:保存鍵及其子鍵信息到指定的文件。 

  14· RegConnectRegistry() 
  原形:LONG RegConnectRegistry( 
        LPTSTR lpMachineName, //遠程計算機的名稱 
        HKEY hKey,    // 預先註冊的句柄 
        PHKEY phkResult  // 遠程計算機上的句柄 
     ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  解釋:連接到遠程系統的註冊表。 

  15·RegNotifyChangeKeyValue() 
  當修改指定的註冊表對象時提供通知。 

  16· RegUnloadKey() 
  LONG RegUnLoadKey( 
     HKEY hKey,     // handle to open key 
     LPCTSTR lpSubKey  // address of name of subkey to unload 
    ); 
  返回值:不成功返回非0,成功返回ERROR_SUCCESS 
  刪除註冊表鍵及其所有的子鍵
發佈了11 篇原創文章 · 獲贊 13 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章