Win32 レジストリエントリを列挙する

レジストリエントリを列挙するには、RegEnumValue関数を用いる


RegEnumValue関数のプロトタイプは以下のとおり。

LONG RegEnumValue(
  HKEY hKey,             // 問い合わせ対象のキーのハンドル
  DWORD dwIndex,         // 取得するべきレジストリエントリのインデックス番号
  LPTSTR lpValueName,    // レジストリエントリ名が格納されるバッファ
  LPDWORD lpcValueName,  // レジストリエントリ名バッファのサイズ
  LPDWORD lpReserved,    // 予約済み
  LPDWORD lpType,        // レジストリエントリのデータのタイプ
  LPBYTE lpData,         // レジストリエントリのデータが格納されるバッファ
  LPDWORD lpcbData       // データバッファのサイズ
);


  • 例として、「HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\\Windows\\CurrentVersion」のレジストリエントリを列挙する
  • #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        HKEY hKey;
        TCHAR szValueName[256];
        DWORD dwValueNameSize;
        DWORD dwType;
        BYTE lpData[256];
        DWORD dwDataSize;
        DWORD i;
        LONG lRet;
        LPCTSTR lpszSubkeyName = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion");
    
    
        //レジストリキーをオープン
        lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubkeyName, 0, KEY_QUERY_VALUE, &hKey);
        if (lRet != ERROR_SUCCESS) {
            return 1;
        }
    
        i = 0;
        while (true) {
        
            dwValueNameSize = sizeof(szValueName)/sizeof(szValueName[0]);
            dwDataSize = sizeof(lpData)/sizeof(lpData[0]);
    
            //インデックス i に対するレジストリエントリを取得する
            lRet = RegEnumValue(hKey,
                i++,
                szValueName,
                &dwValueNameSize,
                NULL,
                &dwType,
                lpData,
                &dwDataSize);
            
            if (lRet != ERROR_SUCCESS) {
                break;
            }
    
    
            wprintf(L"--------------------------------------------------------\n", szValueName);
            wprintf(L"Value: %s\n", szValueName);
    
    
            //レジストリエントリのデータ型dwTypeによって適切な表示方法を選択している
            switch (dwType) {
    
                case REG_DWORD:
                    {
                        DWORD n;
                        memcpy(&n, lpData, sizeof(n));
                        _tprintf(TEXT("Data: %d\n"), n);
                        _tprintf(TEXT("Type: REG_DWORD\n") );
                    }
                    break;
    
                case REG_EXPAND_SZ:
                    {
                        TCHAR lpDst[MAX_PATH];
                        ExpandEnvironmentStrings((LPCWSTR)lpData, lpDst, sizeof(lpDst)/sizeof(lpDst[0]) );
                        _tprintf(TEXT("Value: %s\n"), lpDst);
                        _tprintf(TEXT("Type: REG_EXPAND_SZ\n") );
                    }
                    break;
    
    
                case REG_SZ:
                    _tprintf(TEXT("Data: %s\n"), lpData);
                    _tprintf(TEXT("Type: REG_SZ\n"));
                    break;
    
                default:
                    break;
            }
    
            _tprintf(TEXT("\n"));
    
        }
    
        RegCloseKey(hKey);
    
        return 0;
    }


  • 実行結果
  • --------------------------------------------------------
    Value: SM_GamesName
    Data: Games
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: SM_ConfigureProgramsName
    Data: Set Program Access and Defaults
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: CommonFilesDir
    Data: C:\Program Files (x86)\Common Files
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: CommonFilesDir (x86)
    Data: C:\Program Files (x86)\Common Files
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: CommonW6432Dir
    Data: C:\Program Files\Common Files
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: DevicePath
    Value: C:\Windows\inf
    Type: REG_EXPAND_SZ
    
    --------------------------------------------------------
    Value: MediaPathUnexpanded
    Value: C:\Windows\Media
    Type: REG_EXPAND_SZ
    
    --------------------------------------------------------
    Value: ProgramFilesDir
    Data: C:\Program Files (x86)
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: ProgramFilesDir (x86)
    Data: C:\Program Files (x86)
    Type: REG_SZ
    
    --------------------------------------------------------
    Value: ProgramFilesPath
    Value: C:\Program Files (x86)
    Type: REG_EXPAND_SZ
    
    --------------------------------------------------------
    Value: ProgramW6432Dir
    Data: C:\Program Files
    Type: REG_SZ
    
    --------------------------------------------------------
    Value:
    Data:
    Type: REG_SZ
    



  • 参考

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