WIn32API レジストリキーを列挙する RegEnumKeyEx

レジストリキーを列挙するには、RegEnumKeyEx関数を用いる。

LONG RegEnumKeyEx(
  HKEY hKey,                  // 列挙するべきキーのハンドル
  DWORD dwIndex,              // サブキーのインデックス番号
  LPTSTR lpName,              // サブキー名が格納されるバッファ
  LPDWORD lpcName,            // サブキー名バッファのサイズ
  LPDWORD lpReserved,         // 予約済み
  LPTSTR lpClass,             // クラス名が格納されるバッファ
  LPDWORD lpcClass,           // クラス文字列バッファのサイズ
  PFILETIME lpftLastWriteTime // 最終書き込み時刻
);


  • HKEY_LOCAL_MACHINEのサブキーを列挙するサンプルプログラム

  • HKEY_LOCAL_MACHINE直下のレジストリキーのキー名と最終書き込み時刻を表示している

    #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        TCHAR szSubkeyName[MAX_PATH];
        DWORD dwSubkeyNameSize;
        FILETIME ftLastWriteTime;
        
        for (DWORD dwIndex = 0; TRUE; dwIndex++) {
            
            DWORD dwResult;
    
            dwSubkeyNameSize = sizeof(szSubkeyName)/sizeof(szSubkeyName[0]);
    
            dwResult = RegEnumKeyEx(HKEY_LOCAL_MACHINE, 
                                dwIndex, 
                                szSubkeyName, 
                                &dwSubkeyNameSize, 
                                NULL, 
                                NULL, 
                                NULL, 
                                &ftLastWriteTime);
        
            if (dwResult == ERROR_SUCCESS) {
    
                FILETIME ftLocalTime;
                SYSTEMTIME LastWriteTime;
                TCHAR szLastWriteTime[32];
                
                ::FileTimeToLocalFileTime(&ftLastWriteTime, &ftLocalTime);
                ::FileTimeToSystemTime(&ftLocalTime, &LastWriteTime);
    
                _sntprintf(szLastWriteTime, 
                    sizeof(szLastWriteTime)/sizeof(szLastWriteTime[0]),
                    TEXT("%04d/%02d/%02d %02d:%02d:%02d"), 
                    LastWriteTime.wYear, LastWriteTime.wMonth, LastWriteTime.wDay, 
                    LastWriteTime.wHour, LastWriteTime.wMinute, LastWriteTime.wSecond);
    
                _tprintf(TEXT("SubkeyName: %s, LastWriteTime: %s\n"), szSubkeyName, szLastWriteTime);
    
            } else if (dwResult == ERROR_NO_MORE_ITEMS) {//列挙し終わるとRegEnumKeyExはERROR_NO_MORE_ITEMSを返す
                puts("ERROR_NO_MORE_ITEMS");
                break;
            } else {
                puts("RegEnumKeyEx error");
                break;
            }
     
        }
        
        return 0;
    }



  • 実行結果
  • SubkeyName: BCD00000000, LastWriteTime: 2012/03/05 03:04:22
    SubkeyName: HARDWARE, LastWriteTime: 2012/03/05 03:04:16
    SubkeyName: SAM, LastWriteTime: 2012/03/05 03:04:26
    SubkeyName: SECURITY, LastWriteTime: 2012/03/05 03:04:25
    SubkeyName: SOFTWARE, LastWriteTime: 2012/03/05 03:04:22
    SubkeyName: SYSTEM, LastWriteTime: 2012/03/05 03:04:16
    ERROR_NO_MORE_ITEMS


  • 次のように、RegOpenKeyExで、HKEY_LOCAL_MACHINEのキーをオープンしてもよい
  • #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        TCHAR szSubkeyName[MAX_PATH];
        DWORD dwSubkeyNameSize;
        FILETIME ftLastWriteTime;
        HKEY hKey;
        LONG lRet;
    
        lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_ENUMERATE_SUB_KEYS, &hKey);
        if (lRet != ERROR_SUCCESS) {
            return 1;
        }
        
        for (DWORD dwIndex = 0; TRUE; dwIndex++) {
            
            DWORD dwResult;
    
            dwSubkeyNameSize = sizeof(szSubkeyName)/sizeof(szSubkeyName[0]);
    
            dwResult = RegEnumKeyEx(hKey, 
                                dwIndex, 
                                szSubkeyName, 
                                &dwSubkeyNameSize, 
                                NULL, 
                                NULL, 
                                NULL, 
                                &ftLastWriteTime);
        
            if (dwResult == ERROR_SUCCESS) {
    
                FILETIME ftLocalTime;
                SYSTEMTIME LastWriteTime;
                TCHAR szLastWriteTime[32];
                
                ::FileTimeToLocalFileTime(&ftLastWriteTime, &ftLocalTime);
                ::FileTimeToSystemTime(&ftLocalTime, &LastWriteTime);
    
                _sntprintf(szLastWriteTime, 
                    sizeof(szLastWriteTime)/sizeof(szLastWriteTime[0]),
                    TEXT("%04d/%02d/%02d %02d:%02d:%02d"), 
                    LastWriteTime.wYear, LastWriteTime.wMonth, LastWriteTime.wDay, 
                    LastWriteTime.wHour, LastWriteTime.wMinute, LastWriteTime.wSecond);
    
                _tprintf(TEXT("SubkeyName: %s, LastWriteTime: %s\n"), szSubkeyName, szLastWriteTime);
    
            } else if (dwResult == ERROR_NO_MORE_ITEMS) {//列挙し終わるとRegEnumKeyExはERROR_NO_MORE_ITEMSを返す
                puts("ERROR_NO_MORE_ITEMS");
                break;
            } else {
                puts("RegEnumKeyEx error");
                break;
            }
     
        }
        
        RegCloseKey(hKey);
        
        return 0;
    }


  • 次は、HKEY_LOCAL_MACHINEのサブキーである「SOFTWARE」のサブキーを列挙する例。RegOpenKeyExの第2引数に、サブキー名を指定する。
  • #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        TCHAR szSubkeyName[MAX_PATH];
        DWORD dwSubkeyNameSize;
        FILETIME ftLastWriteTime;
        HKEY hKey;
        LONG lRet;
    
        lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE"), 0, KEY_ENUMERATE_SUB_KEYS, &hKey);
        if (lRet != ERROR_SUCCESS) {
            return 1;
        }
        
        for (DWORD dwIndex = 0; TRUE; dwIndex++) {
            
            DWORD dwResult;
    
            dwSubkeyNameSize = sizeof(szSubkeyName)/sizeof(szSubkeyName[0]);
    
            dwResult = RegEnumKeyEx(hKey, 
                                dwIndex, 
                                szSubkeyName, 
                                &dwSubkeyNameSize, 
                                NULL, 
                                NULL, 
                                NULL, 
                                &ftLastWriteTime);
        
            if (dwResult == ERROR_SUCCESS) {
    
                FILETIME ftLocalTime;
                SYSTEMTIME LastWriteTime;
                TCHAR szLastWriteTime[32];
                
                ::FileTimeToLocalFileTime(&ftLastWriteTime, &ftLocalTime);
                ::FileTimeToSystemTime(&ftLocalTime, &LastWriteTime);
    
                _sntprintf(szLastWriteTime, 
                    sizeof(szLastWriteTime)/sizeof(szLastWriteTime[0]),
                    TEXT("%04d/%02d/%02d %02d:%02d:%02d"), 
                    LastWriteTime.wYear, LastWriteTime.wMonth, LastWriteTime.wDay, 
                    LastWriteTime.wHour, LastWriteTime.wMinute, LastWriteTime.wSecond);
    
                _tprintf(TEXT("SubkeyName: %s, LastWriteTime: %s\n"), szSubkeyName, szLastWriteTime);
    
            } else if (dwResult == ERROR_NO_MORE_ITEMS) {//列挙し終わるとRegEnumKeyExはERROR_NO_MORE_ITEMSを返す
                puts("ERROR_NO_MORE_ITEMS");
                break;
            } else {
                puts("RegEnumKeyEx error");
                break;
            }
     
        }
        
        RegCloseKey(hKey);
        
        return 0;
    }


  • 実行結果(HKEY_LOCAL_MACHINE\SOFTWAREのサブキーを列挙)
  • SubkeyName: ABBYY, LastWriteTime: 2011/10/29 15:31:40
    SubkeyName: Adobe, LastWriteTime: 2012/01/21 15:57:53
    SubkeyName: Apple Computer, Inc., LastWriteTime: 2012/01/16 00:24:33
    SubkeyName: Apple Inc., LastWriteTime: 2012/01/16 00:24:33
    SubkeyName: AuthenTec, LastWriteTime: 2011/10/19 02:52:09
    SubkeyName: calibre, LastWriteTime: 2011/12/11 12:11:00
    SubkeyName: CyberLink, LastWriteTime: 2011/10/19 03:19:14
    SubkeyName: Google, LastWriteTime: 2011/10/29 13:46:15
    SubkeyName: Hewlett-Packard, LastWriteTime: 2011/11/12 10:36:34
    SubkeyName: ICE, LastWriteTime: 2011/11/12 10:35:56
    SubkeyName: IDT, LastWriteTime: 2011/10/19 03:19:14
    SubkeyName: Intel, LastWriteTime: 2011/10/19 02:51:40
    SubkeyName: JavaSoft, LastWriteTime: 2012/03/31 00:07:46
    SubkeyName: JreMetrics, LastWriteTime: 2012/03/31 00:07:46
    SubkeyName: Lake, LastWriteTime: 2011/10/19 03:19:14
    SubkeyName: Licenses, LastWriteTime: 2012/03/31 15:08:27
    SubkeyName: Macromedia, LastWriteTime: 2011/10/19 02:46:31
    SubkeyName: Macrovision, LastWriteTime: 2011/12/03 19:41:14
    SubkeyName: MAXSOFT-OCRON, LastWriteTime: 2011/10/29 15:46:11
    SubkeyName: Microsoft, LastWriteTime: 2012/03/31 15:08:15
    SubkeyName: Microsoft Corporation, LastWriteTime: 2012/03/18 13:48:18
    
    ・・・・・(さらに列挙は続く)

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