新聞中心
注冊(cè)表的操作和文件的操作非常類(lèi)似,也存在打開(kāi)、關(guān)閉、寫(xiě)入、查詢(xún)等操作,也就是“增、刪、改、查”的功能都具備,只是所使用的API函數(shù)都是以Reg開(kāi)頭的。

1. 打開(kāi)和關(guān)閉注冊(cè)表
操作注冊(cè)表需要通過(guò)可以操作注冊(cè)表的句柄,與文件操作類(lèi)似。對(duì)注冊(cè)表進(jìn)行讀寫(xiě)前,需要通過(guò)API函數(shù)打開(kāi)注冊(cè)表,并返回用于操作注冊(cè)表的句柄,通過(guò)操作注冊(cè)表的API函數(shù)來(lái)打開(kāi)返回的句柄,然后對(duì)注冊(cè)表進(jìn)行讀寫(xiě)操作。當(dāng)讀寫(xiě)操作完成后,再通過(guò)API函數(shù)將打開(kāi)的注冊(cè)表句柄進(jìn)行關(guān)閉。
打開(kāi)注冊(cè)表使用的函數(shù)是RegOpenKeyEx()。在Win16下有一個(gè)函數(shù)名為RegOpenKey(),雖然這個(gè)函數(shù)在Win32下仍然可用,但是這是為了兼容目的而設(shè)置的。RegOpenKeyEx()函數(shù)的定義如下:
- 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
- );
參數(shù)說(shuō)明如下。
hKey:指定一個(gè)父鍵句柄。
lpSubKey:指向一個(gè)字符串,用來(lái)表示要打開(kāi)的子鍵名稱(chēng)。
ulOptions:系統(tǒng)保留,必須指定為 0 值。
samDesired:打開(kāi)注冊(cè)表的存取權(quán)限,為了方便對(duì)注冊(cè)表的操作,通常使用 KEY_ALL_ACCESS 即可。
phkResult:指向一個(gè)雙子變量,用來(lái)接收打開(kāi)的子鍵句柄。
如果函數(shù)執(zhí)行成功,則返回 ERROR_SUCCESS,并且在 phkResult 中保存返回打開(kāi)子鍵的句柄。
所謂打開(kāi)注冊(cè)表,實(shí)質(zhì)是打開(kāi)注冊(cè)表的某一個(gè)子鍵,然后進(jìn)行操作。
當(dāng)對(duì)注冊(cè)表操作完成后,則需要關(guān)閉已打開(kāi)的注冊(cè)表句柄以便釋放資源。關(guān)閉釋放注冊(cè)表句柄的函數(shù)定義如下:
- LONG RegCloseKey(
- HKEY hKey // handle to key to close
- );
該函數(shù)只有一個(gè)參數(shù),是RegOpenKeyEx()函數(shù)的最后一個(gè)參數(shù),即被打開(kāi)的注冊(cè)表句柄。
2. 創(chuàng)建和刪除子鍵
創(chuàng)建一個(gè)子鍵的API函數(shù)為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
- );
參數(shù)說(shuō)明如下。
hKey:用來(lái)指定父鍵句柄。
lpSubKey:指向一個(gè)字符串,用來(lái)表示要?jiǎng)?chuàng)建的子鍵名稱(chēng)。
Reserved:系統(tǒng)保留,必須指定為 0 值。
lpClass:子鍵類(lèi)名,一般設(shè)置為 NULL 值。
dwOptions:創(chuàng)建子鍵時(shí)的選項(xiàng),通常情況下使用 REG_OPTION_NON_VOLATILE宏,表示創(chuàng)建的子鍵被創(chuàng)建到注冊(cè)表文件中,而不是內(nèi)存中。
samDesired:打開(kāi)注冊(cè)表的存取權(quán)限,為了方便對(duì)注冊(cè)表的操作,通常使用 KEY_ALL_ ACCESS 即可。
lpSecurityAttributes:該參數(shù)指向一個(gè) SECURITY_ATTRIBUTES 結(jié)構(gòu)體,用來(lái)指定鍵句柄的安全屬性,這里一般使用 NULL。
phkResult:指向一個(gè)雙子變量,用來(lái)接收打開(kāi)的子鍵句柄。
lpdwDisposition:一般設(shè)置為 NULL 值。
如果函數(shù)執(zhí)行成功,則返回ERROR_SUCCESS,并且在phkResult中保存返回創(chuàng)建子鍵的句柄。當(dāng)需要?jiǎng)?chuàng)建的子鍵已經(jīng)存在的時(shí)候,該函數(shù)起到與RegOpenKeyEx()函數(shù)同樣的作用,那么打開(kāi)注冊(cè)表也可以使用RegCreateKeyEx()函數(shù)進(jìn)行代替。不過(guò)該函數(shù)的參數(shù)比RegOpenKeyEx()函數(shù)的參數(shù)多。因此為了在寫(xiě)代碼時(shí)更簡(jiǎn)便,打開(kāi)注冊(cè)表的操作還是使用RegOpenKeyEx()函數(shù)較為省事。
刪除子鍵使用RegDeleteKey()函數(shù),其定義如下:
- LONG RegDeleteKey(
- HKEY hKey, // handle to open key
- LPCTSTR lpSubKey // subkey name
- );
該函數(shù)的值能用來(lái)刪除鍵值項(xiàng),也就是函數(shù)只能刪除最下一層的子鍵。函數(shù)有2個(gè)參數(shù),hKey為父鍵句柄,lpSubKey為指向要?jiǎng)h除的子鍵名稱(chēng)字符串。
3. 注冊(cè)表鍵值的查詢(xún)、寫(xiě)入與刪除
讀取鍵名稱(chēng)中的數(shù)據(jù)或者查詢(xún)鍵名稱(chēng)的屬性使用RegQueryValueEx()函數(shù),其定義如下:
- 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
- );
參數(shù)說(shuō)明如下。
hKey:用來(lái)指定要讀取的鍵值項(xiàng)所處的子鍵句柄。
lpValueName:用來(lái)指定要讀取的鍵值項(xiàng)的名稱(chēng)。
lpReserved:保留參數(shù),必須為 NULL 值。
lpType:接收返回的鍵值類(lèi)型,如果不需要返回鍵值項(xiàng)類(lèi)型,可以給 NULL 值。
lpData:指向一個(gè)緩沖區(qū),用來(lái)接收返回的鍵值數(shù)據(jù)。
lpcbData:在調(diào)用該函數(shù)時(shí),這個(gè)參數(shù)用來(lái)指定緩沖區(qū)的長(zhǎng)度;當(dāng)函數(shù)返回時(shí),該變量保存緩沖區(qū)實(shí)際接收到的長(zhǎng)度。
寫(xiě)入鍵值項(xiàng)的函數(shù)為 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
- );
參數(shù)說(shuō)明如下。
hKey:用來(lái)指定要寫(xiě)入的鍵值項(xiàng)所處的子鍵句柄。
lpValueName:指向定義鍵值項(xiàng)名稱(chēng)的字符串。
Reserved:保留參數(shù),必須為 0 值。
dwType:指出要寫(xiě)入的鍵值數(shù)據(jù)的類(lèi)型。
lpData:指向要寫(xiě)入鍵值數(shù)據(jù)的緩沖區(qū)。
cbData:要寫(xiě)入鍵值數(shù)據(jù)的緩沖區(qū)長(zhǎng)度。
刪除鍵值項(xiàng)的函數(shù)為RegDeleteValue(),其定義如下:
- LONG RegDeleteValue(
- HKEY hKey, // handle to key
- LPCTSTR lpValueName // value name
- );
參數(shù)說(shuō)明如下。
hKey:用來(lái)指定刪除的句柄。
lpValueName:被刪除鍵值項(xiàng)的名稱(chēng)。
4. 子鍵和鍵值的枚舉
枚舉就是逐一獲取。子鍵的枚舉對(duì)指定鍵下面的子鍵進(jìn)行逐一的獲取。鍵值的枚舉是對(duì)指定子鍵下的鍵值進(jìn)行逐一的獲取。
枚舉子鍵的函數(shù)為RegEnumKeyEx(),其定義如下:
- LONG RegEnumKeyEx(
- HKEY hKey, // handle to key to enumerate
- DWORD dwIndex, // subkey index
- LPTSTR lpName, // subkey name
- LPDWORD lpcName, // size of subkey buffer
- LPDWORD lpReserved, // reserved
- LPTSTR lpClass, // class string buffer
- LPDWORD lpcClass, // size of class string buffer
- PFILETIME lpftLastWriteTime // last write time
- );
參數(shù)說(shuō)明如下。
hKey:指定被枚舉的鍵句柄。
dwIndex:指定需要返回信息的子鍵索引編號(hào)。
lpName:用戶(hù)接收返回子鍵名稱(chēng)的緩沖區(qū)。
lpcName:在調(diào)用該函數(shù)前,該參數(shù)保存 lpName 指向緩沖區(qū)的長(zhǎng)度;在該函數(shù)調(diào)用完成后,該參數(shù)保存緩沖區(qū)實(shí)際接收到的數(shù)據(jù)的長(zhǎng)度。
lpReserved:保留參數(shù),必須為 NULL 值。
lpClass:一般為 NULL 值。
lpcClass:一般為 NULL 值。
lpftLastWriteTime:指向一個(gè) FILETIME 結(jié)構(gòu)體,用于接收最后一次被寫(xiě)入的時(shí)間。
枚舉鍵值的函數(shù)為RegEnumValue(),其定義如下:
- LONG RegEnumValue(
- HKEY hKey, // handle to key to query
- DWORD dwIndex, // index of value to query
- LPTSTR lpValueName, // value buffer
- LPDWORD lpcValueName, // size of value buffer
- LPDWORD lpReserved, // reserved
- LPDWORD lpType, // type buffer
- LPBYTE lpData, // data buffer
- LPDWORD lpcbData // size of data buffer
- );
參數(shù)說(shuō)明如下。
hKey:指定被枚舉的鍵句柄。
dwIndex:指定需要返回信息的鍵值索引編號(hào)。
lpValueName:用戶(hù)接收返回鍵值名稱(chēng)的緩沖區(qū)。
lpcValueName:在調(diào)用該函數(shù)前,該參數(shù)保存 lpValueName 指向緩沖區(qū)的長(zhǎng)度;在該函數(shù)調(diào)用完成后,該參數(shù)保存緩沖區(qū)實(shí)際接收到的數(shù)據(jù)的長(zhǎng)度。
lpReserved:保留參數(shù),必須為 NULL 值。
lpType:指向一個(gè)用于返回鍵值數(shù)據(jù)類(lèi)型的雙字變量。
lpData:用戶(hù)接收返回鍵值數(shù)據(jù)的緩沖區(qū)。
lpcbData:在調(diào)用該函數(shù)前,該參數(shù)保存 lpData 指向緩沖區(qū)的長(zhǎng)度;在該函數(shù)調(diào)用完成后,該參數(shù)保存緩沖區(qū)實(shí)際收到的數(shù)據(jù)的長(zhǎng)度。
與注冊(cè)表操作相關(guān)的函數(shù)就介紹到這里。以上是注冊(cè)表操作的常用函數(shù),這里無(wú)法將注冊(cè)表操作相關(guān)的函數(shù)一一介紹,其他相關(guān)函數(shù)在具體使用時(shí)請(qǐng)參考 MSDN 進(jìn)行學(xué)習(xí)。
網(wǎng)頁(yè)題目:網(wǎng)絡(luò)安全編程:注冊(cè)表操作常用API函數(shù)
地址分享:http://fisionsoft.com.cn/article/cdccigh.html


咨詢(xún)
建站咨詢(xún)
