WIn32API レジストリエントリのデータとデータ型を取得する RegQueryValueEx

レジストリエントリのデータとデータ型を取得するには、 RegQueryValueEx関数を用いる


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

LONG RegQueryValueEx(
  HKEY hKey,            // キーのハンドル
  LPCTSTR lpValueName,  // レジストリエントリ名
  LPDWORD lpReserved,   // 予約済み
  LPDWORD lpType,       // データ型が格納されるバッファ
  LPBYTE lpData,        // データが格納されるバッファ
  LPDWORD lpcbData      // データバッファのサイズ
);


  • 例として、レジストリからインターネットエクスプローラのバージョンとそのデータ型を取得する
  • #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        HKEY hKey;
        DWORD dwType;
        TCHAR lpData[256];
        DWORD dwDataSize;
        LONG lRet;
    
        lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
            TEXT("SOFTWARE\\Microsoft\\Internet Explorer"),
            NULL,
            KEY_QUERY_VALUE,
            &hKey);
    
        if (lRet != ERROR_SUCCESS) {
            fprintf(stderr, "RegOpenKeyEx error\n");
            return 1;
        }
    
        dwDataSize = sizeof(lpData)/sizeof(lpData[0]);
    
        lRet = RegQueryValueEx(
          hKey,
          TEXT("Version"),
          0,
          &dwType,
          (LPBYTE)lpData,
          &dwDataSize);
    
        if (lRet != ERROR_SUCCESS) {
            RegCloseKey(hKey);
            fprintf(stderr, "RegQueryValueEx error\n");
            return 1;
        }
    
    
        _tprintf(TEXT("%s\n"), lpData);
    
        switch (dwType) {
        case REG_NONE: // No value type
            _tprintf(TEXT("REG_NONE\n")); 
            break;
        case REG_SZ: // Unicode nul terminated string
            _tprintf(TEXT("REG_SZ\n")); 
            break;
        case REG_EXPAND_SZ: // Unicode nul terminated string  (with environment variable references)
            _tprintf(TEXT("REG_EXPAND_SZ\n")); 
            break;
        case REG_BINARY: // Free form binary
            _tprintf(TEXT("REG_BINARY\n")); 
            break;
        case REG_DWORD_LITTLE_ENDIAN: // 32-bit number
            _tprintf(TEXT("REG_DWORD_LITTLE_ENDIAN\n")); 
            break;
        case REG_DWORD_BIG_ENDIAN: // 32-bit number
            _tprintf(TEXT("REG_DWORD_BIG_ENDIAN\n")); 
            break;
        case REG_LINK: // Symbolic Link (unicode)
            _tprintf(TEXT("REG_LINK\n")); 
            break;
        case REG_MULTI_SZ: // Multiple Unicode strings
            _tprintf(TEXT("REG_MULTI_SZ\n")); 
            break;
        case REG_RESOURCE_LIST: // Resource list in the resource map
            _tprintf(TEXT("REG_RESOURCE_LIST\n")); 
            break;
        case REG_FULL_RESOURCE_DESCRIPTOR:  // Resource list in the hardware description
            _tprintf(TEXT("REG_FULL_RESOURCE_DESCRIPTOR\n")); 
            break;
        case REG_RESOURCE_REQUIREMENTS_LIST: 
            _tprintf(TEXT("REG_RESOURCE_REQUIREMENTS_LIST\n")); 
            break;
        case REG_QWORD: // 64-bit number
            _tprintf(TEXT("REG_QWORD\n"));
            break;
        default: 
            _tprintf(TEXT("Unknown\n")); 
            break;
        }
    
        RegCloseKey(hKey);
    
        return 0;
    }
    


  • 実行結果(IEのバージョンは「9」で、データ型はユニコード文字列型)
  • 9.0.8112.16421
    REG_SZ


  • 参考

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