エントリとその値を列挙する



VC++ の RegEnumValue() でレジストリに登録されているエントリとデータタイプと値を列挙します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    BOX ID 説明
    DialogBox IDD_DIALOG1
    EditControl IDC_EDIT1 データの名前
    EditControl IDC_EDIT2 登録する値
    EditControl IDC_EDIT3 列挙したエントリを表示
    Button IDC_PUTS 登録(String)
    Button IDC_PUTD 登録(DWORD)
    Button IDC_DEL 削除
    Button IDC_ENUM 列挙
    Button CANCEL 終了
  2. IDC_EDIT3 の Dialog Box のプロパティから [Want Return] と [Multi Line] を設定して下さい。
  3. データの名前と登録する文字列をタイプして登録(String)ボタンをクリックすると REG_SZ で登録されます。
  4. データの名前と登録する数値をタイプして登録(DWORD)ボタンをクリックすると REG_DWORD で登録されます。
  5. データの名前をタイプして削除ボタンをクリックするとレジストリから削除されます。
  6. 列挙ボタンをクリックすると登録されているエントリの一覧が EditBox に表示されます。

プログラムの説明

  1. hParentKey で「親のキー」を定義します。
    lpszSubKey で「サブキー」を定義します。
    szName[] は登録する(登録された)データの名前です。
    szText[] は登録する値と列挙したエントリを編集する領域です。
        #define     hParentKey HKEY_CURRENT_USER    //親キー
        #define     lpszSubKey "Software\\maeda"    //サブキー
    
        char        szName[40];
        char        szText[4096];
        char        buf[MAX_PATH];
        char        szVal[MAX_PATH];
        union
        {   DWORD   Val;
            BYTE    Bt[4];
        }   u;
        
  2. CALLBACK 関数やレジストリに登録/削除する関数は、前のページを参照して下さい。
  3. レジストリのエントリを列挙する関数です。
    RegEnumValue() でインデックス番号を指定してエントリ名を取得します。
    dwType で登録されているデータのタイプを調べます。
    取得したエントリ名は、データタイプとその値と改行コードを付加して szText[] に編集します。
        // レジストリのエントリを列挙する
        void  EnumReg()
        {   HKEY    hKey;
            DWORD   dwIdx;
            DWORD   dwLen;
            DWORD   dwType = REG_SZ;
            LONG    lResult;
            DWORD   dwByte;
            char    wk[12];
    
            RegOpenKeyEx(hParentKey,    //親キー
                lpszSubKey,             //サブキー
                0,                      //常にゼロ
                KEY_ALL_ACCESS,         //セキュリティマスク
                &hKey);                 //キーのハンドル
    
            szText[0]= '\0';
            for(dwIdx=0; ; dwIdx++)
            {   dwLen= sizeof(buf);
                dwByte = sizeof(szVal);
                lResult= RegEnumValue(
                    hKey,               //キーのハンドル
                    dwIdx,              //インデックス番号
                    buf,                //エントリ名が格納される領域
                    &dwLen,             //buf のサイズ
                    NULL,               //予約済み
                    &dwType,            //データのタイプ
                    (BYTE *)szVal,      //受け取る領域
                    &dwByte);           //領域のバイト数(受け取ったバイト数)
                if(lResult!=ERROR_SUCCESS)  break;
                strcat(szText,buf);
                switch(dwType)
                {    case REG_SZ:
                         strcat(szText,":REG_SZ=");
                         strcat(szText,szVal);
                         strcat(szText,"\r\n");
                         break;
                     case REG_DWORD:
                         strcat(szText,":REG_DWORD=");
                         u.Bt[0]= szVal[0];
                         u.Bt[1]= szVal[1];
                         u.Bt[2]= szVal[2];
                         u.Bt[3]= szVal[3];
                         wsprintf(wk,"%d",u.Val);
                         strcat(szText,wk);
                         strcat(szText,"\r\n");
                         break;
                    default:
                         strcat(szText,":DEFAULT=");
                         strcat(szText,szVal);
                         strcat(szText,"\r\n");
                         break;
                }
            }
            RegCloseKey(hKey);
            return;
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)