API---注冊表編程


首先來認識一下鍵,項,值吧:

 

 

左邊有五個根鍵

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USER

HKEY_CURRENT_CONFIG

根鍵展開后可以看到子健:像 "SOFTWARE, Microsoft, Windows, CurrentVersion 等都是子健。

而最后一級便不是子健了,而是項:Run。

“名稱欄” 下方的都稱為 鍵值項

“類型欄” 下方的都稱為 鍵值項的類型

“數據欄” 下方的都稱為 鍵值項的鍵值

 

RegCreateKeyEx() 介紹:

功能:創建或打開注冊表鍵。

 函數原型:LONG RegCreateKeyEx(
              HKEY hKey,        // 鍵的句柄 (RegCreateKey, RegCreateKey() 的返回值) 或者 預定義的值( 即五個根鍵)。
              LPCTSTR lpSubKey,   // 指向 要創建或要打開的子健名稱。
              DWORD Reserved,     // 保留值必須為 0,
              LPTSTR lpClass,     // 指向一個字符串,該字符串定義了該鍵的類型。可以為空。
              DWORD dwOptions,  //  新創建的鍵的屬性。
              REGSAM samDesired,   // 鍵的訪問權限。
              LPSECURITY_ATTRIBUTES lpSecurityAttributes,   // 指向 SECURITY_ATTRIBUTES 結構的指針。

                                                                      // 定義返回的句柄是否可以被子進程繼承,為 NULL 表示不繼承。
              PHKEY phkResult,                 // 指向新創建或打開的鍵的句柄的指針,保存返回的句柄。
              LPDWORD lpdwDisposition  //  指明鍵是被創建還是被打開的
              ); 

(入參,即輸入的參數。出參,即輸出的參數)

參數:dwOptions

    REG_OPTION_NON_VOLATILE 新創建的鍵為一個非短暫性的鍵 (數據信息保存在文件中,當系統重新啟動時,數據信息恢復)
    REG_OPTION_VOLATILE 新創建的鍵為一個短暫性的鍵(數據信息保存在內存中)。
    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

參數:lpdwDisposition (出參)

       REG_CREATED_NEW_KEY 鍵先前不存在,現在被創建。
  REG_OPENED_EXISTING_KEY 鍵先前已存在,現在被打開。

返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。

 

RegOpenKeyEx() 介紹:

功能:打開一個已經存在的子健。

函數原型:LSTATUS RegOpenKeyEx(
                  HKEY   hKey,
                  LPCSTR lpSubKey,
                  DWORD  ulOptions,   // 保留值必須為 0。
                  REGSAM samDesired,
                  PHKEY  phkResult
                  );

參數:同 RegCreateKeyEx()。

返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。

 

RegCloseKey() 介紹:
功能:關閉注冊表。

函數原型:LONG RegCloseKey(

                  HKEY hKey // 釋放鍵的句柄。
                  );
返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。
 
RegDeleteKey() 介紹:
功能:刪除注冊表鍵值。(不能刪除含有子健的子健)
函數原型:LSTATUS RegDeleteKey(
                  HKEY   hKey,
                  LPCSTR lpSubKey,
                  REGSAM samDesired,
                  DWORD  Reserved   // 保留值必須為 0。
                  );
返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。
 
RegQueryValueEx() 介紹:
功能:檢索一個已打開的注冊表句柄中,指定的注冊表鍵的類型和設置值。
函數原型:LSTATUS RegQueryValueExA(
                  HKEY  hKey,  // 已打開項的句柄,或者指定一個標准項名。
                  LPCSTR  lpValueName,  // 要查詢注冊表鍵值的名字字符串,注冊表鍵的名字,以空字符結束。
                  LPDWORD  lpReserved,  // 保留值必須為 0。
                  LPDWORD  lpType,  //用於裝載取回數據類型的一個指針變量。
                  LPBYTE  lpData,  //用於裝載指定值的一個緩沖區,可以為空。
                  LPDWORD  lpcbData  //用於裝載 lpData 緩沖區長度的一個變量。一旦返回,它會設為實際裝載到緩沖區的字節數。
                                                    // 若 lpData 為 NULL, 則也為 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類型的字符串。
返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。
 
RegSetValueEx() 介紹:
功能:在注冊表項下設置指定值的數據和類型。
函數原型:LONG RegSetValueEx(
             HKEY hKey,
             LPCTSTR lpValueName,
             DWORD Reserved,// 保留值必須為0。
             DWORD dwType,
             CONST BYTE *lpData,
             DWORD cbData
               );
參數:同 RegQueryValueEx()。
返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。
 
RegDeleteValue() 介紹:
功能:刪除指定項下方的一個值。
函數原型:LSTATUS RegDeleteValue(
                  HKEY   hKey,
                  LPCSTR lpValueName  // 指向要刪除的值名。
                  );
返回值:如果函數調用成功,則返回 ERROR_SUCCESS。否則返回非零的錯誤代碼。
 
DEMO CODE:(注意:能修改成功的注冊表一般都在 HKEY_CURRENT_USER 這個根鍵里)
#include<stdio.h>
#include<Windows.h>
int main(void)
{
    LONG Long, Long0;
    HKEY hKey = NULL;
    char Buffer[] = "www.baidu.com";
    Long = RegOpenKeyEx(HKEY_CURRENT_USER,
        "SOFTWARE\\Microsoft\\Internet Explorer\\Main",
        0,
        KEY_ALL_ACCESS,
        &hKey);
    if (Long != ERROR_SUCCESS)
    {
        printf("Open Error!\n");
        system("pause");
        exit(0);
    }

    Long0 = RegSetValueEx(hKey,
        "Start Page",
        0,
        REG_SZ,
        (CONST BYTE *)Buffer,
        strlen(Buffer));

    if (Long0 != ERROR_SUCCESS)
    {
        printf("Set Value Error!\n");
        system("pause");
        exit(0);
    }

    printf("Modify Succeed!\n");
    system("pause");
    return 0;
}

 

 


免責聲明!

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



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