本文由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;
}
效果圖: