1. 程式人生 > >[Win32] 登錄檔操作(2)列舉登錄檔

[Win32] 登錄檔操作(2)列舉登錄檔

關於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;
}


效果圖: