目錄
(本章節中例子都是用 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中同樣的數據和任何注冊表的變化都會同時的變化.
相關函數

[創建鍵][打開鍵][刪除鍵][添加/修改鍵值][刪除鍵值][讀取鍵值]
函數原型
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 鍵已存在
函數原型
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: 接收打開的鍵的句柄
函數原型
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: 指向一個用於定義子鍵路徑的字符串
函數原型
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: 鍵值數據長度
函數原型
LONG RegDeleteValue( HKEY hKey, // handle to key LPCTSTR lpValueName // value name );
參數說明
- hKey: 打開鍵的句柄或以下預定義句柄
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_USERS
- lpValueName: 鍵值的名稱
函數原型
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"鍵值):
刪除鍵值
程序源碼:(鏈接)
運行結果:

#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 中添加鍵值來讓程序在開機時被系統加載.
步驟:
- 設置開機啟動
- 取消開機啟動
程序源碼:

//這里用的是寬字符,既 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); //----------------關閉注冊表 } }