Win32API レジストリエントリを列挙する RegEnumValue
レジストリキーに所属するレジストリエントリを列挙するには、RegEnumValue関数を用いる
LONG RegEnumValue( HKEY hKey, // 問い合わせ対象のキーのハンドル DWORD dwIndex, // 取得するべきレジストリエントリのインデックス番号 LPTSTR lpValueName, // レジストリエントリ名が格納されるバッファ LPDWORD lpcValueName, // レジストリエントリ名バッファのサイズ LPDWORD lpReserved, // 予約済み LPDWORD lpType, // レジストリエントリのデータのタイプ LPBYTE lpData, // レジストリエントリのデータが格納されるバッファ LPDWORD lpcbData // データバッファのサイズ );
まず、以下のようにHKEY_CURRENT_USERの直下に、「Test」というレジストリキーを作成し、そのレジストリエントリを作成する。
サンプルプログラムでは、このレジストリキー「Test」に所属するレジストリエントリを列挙する。
#include <windows.h> #include <stdio.h> #include <locale.h> int main() { HKEY hKey; TCHAR szValueName[MAX_PATH]; DWORD dwValueNameSize; BYTE lpData[1024*4]; DWORD dwDataSize; DWORD dwType; LPTSTR lpSubkeyName = TEXT("Test"); LSTATUS Status; //Unicode文字列をコンソールに表示させるため setlocale(LC_ALL, setlocale(LC_CTYPE, "")); Status = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubkeyName, 0, KEY_QUERY_VALUE, &hKey); if (Status != ERROR_SUCCESS) { return 1; } for (DWORD dwIndex = 0; ; dwIndex++) { dwValueNameSize = sizeof(szValueName)/sizeof(szValueName[0]); dwDataSize = sizeof(lpData)/sizeof(lpData[0]); Status = RegEnumValue(hKey, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, lpData, &dwDataSize); if (Status == ERROR_NO_MORE_ITEMS) { puts("\nERROR_NO_MORE_ITEMS"); break; } else if (Status != ERROR_SUCCESS) { puts("\nRegEnumValue error"); break; } else {//Status == ERROR_SUCCESS _tprintf(TEXT("-----------------------------------------------------------\n")); _tprintf(TEXT("ValueName: %s\n"), szValueName); switch (dwType) { case REG_BINARY: //バイナリ値は、Hexダンプする puts("REG_BINARY"); for (DWORD i = 0; i < dwDataSize; i++) { printf("%02X ", lpData[i]); } putchar('\n'); break; case REG_DWORD: puts("REG_DWORD"); DWORD dwValue; memcpy(&dwValue, lpData, sizeof(dwValue)); printf("%d\n", dwValue); break; case REG_EXPAND_SZ: //ExpandEnvironmentStringsで環境変数文字列を展開してから表示する puts("REG_EXPAND_SZ"); TCHAR szDst[MAX_PATH]; ExpandEnvironmentStrings( (LPTSTR)lpData, szDst, sizeof(szDst)/sizeof(szDst[0]) ); _tprintf(TEXT("%s\n"), szDst); break; case REG_QWORD: puts("REG_QWORD"); __int64 n; memcpy(&n, lpData, sizeof(n)); _tprintf(TEXT("%lld\n"), n); break; default: break; } } } RegCloseKey(hKey); return 0; }
----------------------------------------------------------- ValueName: 文字列 ----------------------------------------------------------- ValueName: バイナリ REG_BINARY FF FF FF FF FF FF ----------------------------------------------------------- ValueName: DWORD REG_DWORD 256 ----------------------------------------------------------- ValueName: QWORD REG_QWORD 72057594037927936 ----------------------------------------------------------- ValueName: EXPAND REG_EXPAND_SZ C:\Windows\system32\drivers ERROR_NO_MORE_ITEMS