レジストリキーに所属している値の名前と数を取得するには?

[戻る]
さっち 2002/09/04(水) 17:34:28
Windows2000、VC++6.0です。
レジストリについて、教えてください。

以下のようにレジストリ"mykey"をオープンしました。

// レジストリオープン
lResult = ::RegCreateKeyEx( HKEY_CURRENT_USER, 
                            "myKey", 0, "",
                            REG_OPTION_NON_VOLATILE,
                            KEY_ALL_ACCESS, NULL,
                            &hkResult, &dwDisposition );

このレジストリmykeyに所属している値の名前と値の数(値が何個あるか?)は
どのように取得すればよいのでしょうか?

よろしくお願いします。

Empty [E-Mail] 2002/09/04(水) 20:42:39
 RegEnumKeyEx 関数を使えばよいのではないのでしょうか?
 コンパイルは通していないので正しいコードかどうかは分かりませんが、こんな感じで使いま
す。

 TCHAR lpszName[256];    // サブキー名を格納するバッファ。
 DWORD dwNameSize = 256; // サブキー名を入れるバッファサイズ。
 FILETIME ft;            // サブキーの最終書き込み時刻
 LONG lRes;
 for ( DWORD i = 0;; i++ )
 {
    //  関数から処理が返ると、dwNameSize は格納した文字数に置き換わっているので、
    // バッファサイズに初期化。
    dwNameSize = 256;
    lRes = ::RegEnumKeyEx(
                    hkResult,
                    i,
                    lpszName,
                    &dwNameSize,
                    NULL,
                    NULL,
                    NULL,
                    &ft
                    );
    if ( lRes != ERROR_SUCCESS )
    {
       break;
    }

    // ここで取得したキー名を色々する。
 }

 // この時点で lRes に ERROR_NO_MORE_ITEMS が入っていたら、列挙成功。

さっち 2002/09/05(木) 12:20:27
[[解決]]
Empty様 ありがとうございます。
まず...私の質問の仕方が悪くて申し訳ありませんでした。

Emptyさんの方法は、サブキーの列挙ですね。
私のやりたかったことは、値(MSDNにはレジストリエントリと書いてありました)の
列挙だったのです。

教えていただいたRegEnumKeyEx()をヒントに
RegEnumValue()を使用しました。
以下は、その部分の抜粋です。

おかげさまで解決しました。
ありがとうございました。<(_ _)>

--------------------------------------------------------------
// レジストリーキーに所属するレジストリエントリを列挙し、その値を取得する。
for ( DWORD dIndex = 0;  ; dIndex++ )
{
    dwNameSize = 256;

    // レジストリエントリの列挙
    lResult = ::RegEnumValue( hkResult,
                              dIndex,
                              szName,
                              &dwNameSize,
                              NULL,
                              &dwType,
                              NULL,
                              NULL);

    if ( lResult == ERROR_NO_MORE_ITEMS )
    {   // 列挙終了。値列挙のループを抜ける。
        break;
    }
    if ( lResult != ERROR_SUCCESS )
    {   // その他エラー
        throw( ENUMREG );
    }

    // レジストリエントリの値取得
    switch ( dwType )
    {
    case REG_DWORD: // 数値

        lResult = ::RegQueryValueEx( hkResult,
                                     szName,
                                     NULL,
                                     &dwType,
                                     (LPBYTE)&dwNum,
                                     &dwSize );
        if ( lResult != ERROR_SUCCESS )
            throw( GETNUM );

        strMsg.Format( "%d", dwNum );
        AfxMessageBox( strMsg );
        break;
        
    case REG_SZ: // 文字列

        lResult = ::RegQueryValueEx( hkResult,
                                     szName,
                                     NULL,
                                     &dwType,
                                     (LPBYTE)(LPCTSTR)strString,
                                     &dwSize );

        if ( lResult != ERROR_SUCCESS )
            throw( GETSTRING );

        AfxMessageBox( strString );
        break;

    default:
        AfxMessageBox( "その他のタイプ" );
        break;
    }
}

古いスレッドには追加発言できません。