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
    


    参考
    http://msdn.microsoft.com/ja-jp/library/cc429914.aspx