[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;
}
效果圖: