注冊表操作(VC_Win32)


目錄

注冊表概述
注冊表相關函數詳解
注冊表編程

(本章節中例子都是用 VS2005 編譯調試的)


注冊表概述

概述

注冊表是windows操作系統中的一個核心數據庫,其中存放着各種參數,直接控制着windows的啟動、硬件驅動程序的裝載以及一些windows應用程序的運行,從而在整個系統中起着核心作用.這些作用包括了軟、硬件的相關配置和狀態信息,比如注冊表中保存有應用程序和資源管理器外殼的初始條件、首選項和卸載數據等,聯網計算機的整個系統的設置和各種許可,文件擴展名與應用程序的關聯,硬件部件的描述、狀態和屬性,性能記錄和其他底層的系統狀態信息,以及其他數據等.

數據結構

注冊表由鍵(或稱"項")、子鍵(子項)和值項構成.一個鍵就是分支中的一個文件夾,而子鍵就是這個文件夾中的子文件夾,子鍵同樣是一個鍵.一個值項則是一個鍵的當前定義,由名稱、數據類型以及分配的值組成.一個鍵可以有一個或多個值,每個值的名稱各不相同,如果一個值的名稱為空,則該值為該鍵的默認值.

數據類型

注冊表的數據類型主要有以下四種:
顯示類型(在編輯器中)   數據類型    說明                   
REG_SZ          字符串     文本字符串
REG_MULTI_SZ       多字符串    含有多個文本值的字符串
REG_BINARY         二進制數    二進制值,以十六進制顯示.
REG_DWORD        雙字      一個32位的二進制值,顯示為8位的十六進制值.

各主鍵的簡單介紹

  • HKEY_LOCAL_MACHINE  是一個顯示控制系統和軟件的處理鍵.HKLM鍵保存着計算機的系統信息.它包括網絡和硬件上所有的軟件設置.
  • HKEY_CLASSES_ROOT  是系統中控制所有數據文件的項.
  • HKEY_USERS  將缺省用戶和目前登陸用戶的信息輸入到注冊表編輯器
  • HKEY_CURRENT_USER  包含着在HKEY_USERS安全辨別里列出的同樣信息
  • HKEY_CURRENT_CONFIG  包括了系統中現有的所有配置文件的細節.HKEY_CURRENT_CONFIG允許軟件和設備驅動程序員很方便的更新注冊表,而不涉及到多個配置文件信息. HKEY_LOCAL_MACHINE中同樣的數據和任何注冊表的變化都會同時的變化.

相關函數

顯示相關函數

[創建鍵][打開鍵][刪除鍵][添加/修改鍵值][刪除鍵值][讀取鍵值]

創建鍵 RegCreateKeyEx

函數原型

LONG RegCreateKeyEx(
  HKEY hKey,                                  // handle to open key
  LPCTSTR lpSubKey,                           // subkey name
  DWORD Reserved,                             // reserved
  LPTSTR lpClass,                             // class string
  DWORD dwOptions,                            // special options
  REGSAM samDesired,                          // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
  PHKEY phkResult,                            // key handle 
  LPDWORD lpdwDisposition                     // disposition value buffer
);

參數說明

  • hKey:   要打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一個用於定義子鍵路徑的字符串
  • Reserved,dwOptions,samDesired:   置0
  • lpClass,lpSecurityAttributes:   置NULL
  • phkResult:   用於接收鍵句柄
  • lpdwDisposition:   接收的相關信息,取值如下
    • REG_CREATED_NEW_KEY   創建成功
    • REG_OPENED_EXISTING_KEY    鍵已存在

打開鍵 RegOpenKeyEx

函數原型

LONG RegOpenKeyEx(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey,  // subkey name
  DWORD ulOptions,   // reserved
  REGSAM samDesired, // security access mask
  PHKEY phkResult    // handle to open key
);

參數說明

  • hKey:     要打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一個用於定義子鍵路徑的字符串
  • ulOptions:   保留位,置0
  • samDesired:   打開鍵后鍵的操作權限
  • phResult:   接收打開的鍵的句柄

刪除鍵 RegDeleteKey

函數原型

LONG RegDeleteKey(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey   // subkey name
);

參數說明

  • hKey:   要打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一個用於定義子鍵路徑的字符串

修改/添加鍵值 RegSetValueEx

函數原型

LONG RegSetValueEx(
  HKEY hKey,           // handle to key
  LPCTSTR lpValueName, // value name
  DWORD Reserved,      // reserved
  DWORD dwType,        // value type
  CONST BYTE *lpData,  // value data
  DWORD cbData         // size of value data
);

參數說明

  • hKey:   打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   鍵值的名稱
  • Reserved:   保留位,置0
  • dwType:   鍵值的類型
  • lpData:   鍵值
  • cbData:   鍵值數據長度

刪除鍵值 RegDeleteValue

函數原型

LONG RegDeleteValue(
  HKEY hKey,            // handle to key
  LPCTSTR lpValueName   // value name
);

參數說明

  • hKey:   打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   鍵值的名稱

讀取鍵值 RegQueryValueEx

函數原型

LONG RegQueryValueEx(
  HKEY hKey,            // handle to key
  LPCTSTR lpValueName,  // value name
  LPDWORD lpReserved,   // reserved
  LPDWORD lpType,       // type buffer
  LPBYTE lpData,        // data buffer
  LPDWORD lpcbData      // size of data buffer
);

參數說明

 

  • hKey:   打開鍵的句柄或以下預定義句柄
    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   鍵值的名稱
  • Reserved:   保留位,置0
  • lpType:   接收鍵值的類型
  • lpData:   接收鍵值
  • lpcbData:   接收鍵值數據長度

相關文獻: RegSetValueEx用法 


注冊表編程(利用注冊表寫開機啟動程序)

執行流程

代碼樣例

創建鍵

程序源碼:(鏈接)

運行結果:

刪除鍵

程序源碼:(鏈接)

運行結果:

修改/創建鍵值

程序源碼:(鏈接)

運行結果:

讀取鍵值

程序源碼:(鏈接)

運行結果(讀取"test"鍵值):

刪除鍵值

程序源碼:(鏈接)

運行結果:

程序源碼

View Code
#include <windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;

void main()
{
    HKEY hKey;     
    LPCTSTR lpRun = "Software\\_MyTest";
    DWORD state,dwtype,sizeBuff;
    long lRet;
    char reBuff[10] = {0};


    /*創建鍵***************************************************************************/
    ////創建鍵
    //lRet = RegCreateKeyEx(HKEY_CURRENT_USER,lpRun,0,NULL,0,0,NULL,&hKey,&state);
    //if(lRet == ERROR_SUCCESS)
    //{
    //    if(state == REG_CREATED_NEW_KEY)
    //        cout<<"表項創建成功"<<endl;
    //
    //    //關閉鍵
    //    RegCloseKey(hKey);
    //}


    /*打開/修改鍵值********************************************************************/
    ////打開鍵
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
    //if(lRet == ERROR_SUCCESS) 
    //{     
    //    //創建或者修改鍵值
    //    RegSetValueEx(hKey, "test",0,REG_SZ,(BYTE *)"success",10);
    //    
    //    //關閉鍵    
    //    RegCloseKey(hKey);
    //}


    /*讀取鍵值*************************************************************************/
    ////打開鍵
    //lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_READ, &hKey);
    //if(lRet == ERROR_SUCCESS) 
    //{
    //    sizeBuff = sizeof(reBuff);
    //    
    //    //讀取鍵值
    //    if(RegQueryValueEx(hKey,"test",0,&dwtype,(BYTE*)reBuff,&sizeBuff) == ERROR_SUCCESS)
    //        cout<<reBuff<<endl;
    //    
    //    //關閉鍵
    //    RegCloseKey(hKey);
    //}


    /*刪除鍵值************************************************************************/
    ////打開鍵
    //lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);    
    //if(lRet==ERROR_SUCCESS)
    //{
    //    //刪除鍵
    //    RegDeleteValue(hKey,"test");
    //    
    //    //關閉鍵
    //    RegCloseKey(hKey);
    //}


    /*刪除鍵**************************************************************************/
    RegDeleteKey(HKEY_CURRENT_USER,lpRun);

    system("pause");
}

 

利用注冊表寫開機啟動程序

說明:

通過向注冊表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 中添加鍵值來讓程序在開機時被系統加載.

步驟:

  • 設置開機啟動
      
  • 取消開機啟動
      

程序源碼:

View Code
//這里用的是寬字符,既 wchar_t

if(isStartOpen)
{
    //開機啟動
    HKEY hKey;     
    LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
    //---------------找到系統的啟動項 
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    //-----------打開啟動項Key  
    if(lRet == ERROR_SUCCESS) 
    { 
        wchar_t pFileName[MAX_PATH] = {0}; 
        DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
        //----------------得到程序自身的全路徑 
        lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
        //----------------添加或者修改注冊表項
        RegCloseKey(hKey);
        //----------------關閉注冊表
    }
}    
else
{
    //取消卡機啟動
    HKEY hKey;     
    LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
    //---------------找到系統的啟動項 
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    if(lRet==ERROR_SUCCESS)
    {
        RegDeleteValue(hKey,L"DeskPro");
        //----------------刪除注冊表項
        RegCloseKey(hKey);
        //----------------關閉注冊表
    }
}

 


免責聲明!

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



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