天天看點

[Win32] 系統資料庫操作(2)枚舉系統資料庫

本文由CSDN使用者zuishikonghuan所作,轉載請注明出處: http://blog.csdn.net/zuishikonghuan/article/details/46981391

上一篇“[Win32] 系統資料庫操作(1)基本操作和建立開機自啟動 ”(http://blog.csdn.net/zuishikonghuan/article/details/46967369)中,介紹了系統資料庫的基本操作函數,這一篇說說如何枚舉系統資料庫。時間原因不再貼每個函數的MSDN的位址了。

關于WOW64的問題:

32位程式運作在64位系統上操作系統資料庫會出現問題,在上篇已經有詳細的說明了,是以,這一節不再重複。

十。枚舉鍵值(值項)

RegEnumValue函數:

LONG WINAPI RegEnumValue(
  _In_        HKEY    hKey,
  _In_        DWORD   dwIndex,
  _Out_       LPTSTR  lpValueName,
  _Inout_     LPDWORD lpcchValueName,
  _Reserved_  LPDWORD lpReserved,
  _Out_opt_   LPDWORD lpType,
  _Out_opt_   LPBYTE  lpData,
  _Inout_opt_ LPDWORD lpcbData
);
           

hKey:要打開鍵的句柄或以下預定義句柄

HKEY_CLASSES_ROOT

HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

dwIndex:序号,從0開始計算

lpValueName:提供緩沖區,用于接收鍵值的名稱

lpcchValueName:指向一個DWORD的指針,提供lpValueName緩沖區的大小

lpReserved:保留,置NULL

lpType:指向一個DWORD的指針,用于接收鍵類型(關于鍵類型請看上一篇),可空

lpData:提供緩沖區,用于接收鍵值,可空

lpcbData:指向一個DWORD的指針,提供lpData緩沖區的大小

傳回值:成功傳回ERROR_SUCCESS,沒有更多值(dwIndex超出鍵值數)時傳回ERROR_NO_MORE_ITEMS。

十一。枚舉子健

RegEnumKeyEx函數:

LONG WINAPI RegEnumKeyEx(
  _In_        HKEY      hKey,
  _In_        DWORD     dwIndex,
  _Out_       LPTSTR    lpName,
  _Inout_     LPDWORD   lpcName,
  _Reserved_  LPDWORD   lpReserved,
  _Inout_     LPTSTR    lpClass,
  _Inout_opt_ LPDWORD   lpcClass,
  _Out_opt_   PFILETIME lpftLastWriteTime
);
           

hKey:要打開鍵的句柄或以下預定義句柄

HKEY_CLASSES_ROOT

HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

dwIndex:序号,從0開始計算

lpName:指針,用于接收子健名稱

lpcName:指向緩沖區長度的指針

lpReserved:保留,置NULL

lpClass:指向用于接收枚舉子項的使用者定義的類的緩沖區指針。此參數可以為 NULL

lpcClass:指向lpClass緩沖區長度的指針

lpftLastWriteTime:指向接收最後一次枚舉的子項時時間的 FILETIME 結構的指針。此參數可以為 NULL

例子:

//注意本代碼隻能使用Ansi版本運作
#include <stdio.h>
#include<windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	BOOL isWOW64;
	REGSAM p = KEY_READ;
	IsWow64Process(GetCurrentProcess(), &isWOW64);//判斷環境是否為WOW64
	if (isWOW64)
		p |= KEY_WOW64_64KEY;

	HKEY hKey;
	if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion"), 0, NULL, 0, p, NULL, &hKey, NULL) != ERROR_SUCCESS){
		//失敗
		return 0;
	}//打開鍵

	LONG re;
	int i = 0;

	puts("枚舉值項");
	char name[16383] = { 0 };
	DWORD type;
	do{
		DWORD lang = 16383;
		re = RegEnumValue(hKey, i, name, &lang, 0, &type, NULL, NULL);
		if (strcmp(name, "") != 0){
			printf("<Type:%u> ", type);
			puts(name);
		}
		i++;
	} while (re != ERROR_NO_MORE_ITEMS);

	puts("\r\n枚舉子鍵");
	char key[256] = { 0 };
	i = 0;
	do{
		DWORD lang = 256;
		re = RegEnumKeyEx(hKey, i, key, &lang, NULL, NULL, NULL, NULL);
		if (strcmp(key, "") != 0)
			puts(key);
		i++;
	} while (re != ERROR_NO_MORE_ITEMS);

	RegCloseKey(hKey);
	getchar();
	return 0;
}
           

效果圖:

[Win32] 系統資料庫操作(2)枚舉系統資料庫

繼續閱讀