轉自 http://blog.csdn.net/xiaoxiaohai123/article/details/1685153 (部分修改)
參考《深入解析Windows作業系統》(第四版) 潘愛民 譯
一、簡介:
註冊表(Registry),本質上來說,就是一個資料庫,用於儲存系統和應用程式的設定資訊,直接控制著windows的啟動、硬體驅動程式的裝載以及一些windows應用程式的運行,從而在整個系統中起著核心作用,其結構類似於磁碟卷的結構。註冊表包含了
鍵(key)和 值(value)。鍵類似於磁碟的目錄,而值則好比磁碟上的檔案。鍵是一個容器,可以包含其他的鍵(子鍵)和值,而值儲存的是資料。最頂級的鍵是根鍵(Root key),只有根鍵才不是子鍵。
註冊表有6個根鍵,你不能加入新的根鍵,也不能刪除已有的根鍵。開啟註冊表就能看見其結構。開啟方法:(1)直接雙擊regedit.exe,一般位於C:\Windows目錄下(作業系統裝在C盤);(2)“開始”----“運行“,在出現對話方塊中輸入regedit,然後斷行符號即可。
註冊表的每個根鍵控制代碼都是固定不變的,如下表所示:
| 鍵名 |
控制代碼 |
鍵名 |
控制代碼 |
| HKEY_CLASSES_ROOT |
&H80000000 |
HKEY_DYN_DATA |
&H80000006 |
| HKEY_CURRENT_CONFIG |
&H80000005 |
HKEY_LOCAL_MACHINE |
&H80000002 |
| HKEY_CURRENT_USER |
&H80000001 |
HKEY_USERS |
&H80000003 |
註冊表資料類型
程式中要用到的註冊表資料類型如下表所示:
| REG_BINARY |
位元據 |
| REG_DWORD |
32位雙字 |
| REG_DWORD_LITTLE_ENDIAN |
大計數法格式32位元字,一個字的有效位元組是高端字 |
| REG_DWORD_BIG_ENDIAN |
大計數法格式32位元字,一個字的有效位元組是低端字 |
| REG_EXPAND_SZ |
空終止字串,包括對"&TEMP&"之類環境變數的引用 |
| REG_LINK |
單一代碼符號鏈 |
| REG_MULTI_SZ |
定義包括空終止字串的數組,數組被兩個實際的Null 字元串結束 |
| REG_NONE |
未定義實值型別 |
| REG_RESOUSE_LIST |
裝置驅動程式列表 |
| REG_SZ |
Null 字元串,是儲存字串的最通用格式 |
二、API操作
既然註冊表對於作業系統來說,至關重要。那麼對於註冊表的修改,就必須十分謹慎。(如果你掌握了安全的修改註冊表的方法,還是能做出很多意想不到的效果滴)一般而言,我們不推薦直接編輯註冊表,而微軟也為我們提供了一下API來操作註冊表,本文就藉助簡單的例子介紹一下常用的幾個函數的運用。
(1)RegCreateKeyEx ——建立一個鍵,如果這個鍵已經存在的話,就相當是把它開啟了。
其聲明如下:(九個參數)
LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition );
參數介紹:
hKey:這是一個已經開啟的鍵的控制代碼,看來是要在一個已經開啟的鍵建立一個子鍵了。就好象在一個已經存在的目錄下建立一個字目錄一樣。如果你開始沒有一個已經開啟的鍵的控制代碼,則hKey可以是如下的值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_DYN_DATA (只能是Win98,Win95,WinMe系統)
lpSubKey:一個字串,不用說是什麼意思了吧?就是說你要把你的註冊表鍵放在哪個位置了。注意:lpSubKey不能為NULL,且字串中 \ 應為 \\ ;
Reserved:保留的,必須是0。
lpClass:一個字串,據說是指定你要建立的鍵的類型,設它為NULL;
dwOptions:對你建立的鍵的一些選項。可以是這些值:REG_OPTION_NON_VOLATILE,REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE
samDesired :對這個建立的鍵的存取權限了,一般設定為KEY_ALL_ACCESS;
lpSecurityAttributes:可設為NULL。
phkResult:這可是個很重要的參數了,建立一個鍵後,這個鍵的控制代碼就放在這裡,以後操作就全靠它了。注意了,它是一個指向HKEY的指標。
lpdwDisposition:又是一個指標,調用完此函數後,可以通過它來檢測是開啟了一個已經存在的鍵(REG_OPENED_EXISTING_KEY),還是建立了一個鍵(REG_CREATED_NEW_KEY)。
當建立一個鍵成功,其傳回值為ERROR_SUCCESS,否則,則為失敗。
#include<windows.h>void main(){ DWORD dwRes; HKEY hk; if(ERROR_SUCCESS==RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE//Carrier Studio//Hello", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk,&dwRes)printf("Create key Successful!\n");}