登録されているエントリを列挙する



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

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

プロジェクトの作成

  1. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    BOX ID 説明
    DialogBox IDD_DIALOG1
    EditControl IDC_EDIT1 データの名前
    EditControl IDC_EDIT2 登録する値
    EditControl IDC_EDIT3 列挙したエントリを表示
    Button IDC_PUT 登録
    Button IDC_DEL 削除
    Button IDC_ENUM 列挙
    Button IDCANCEL 終了
  2. IDC_EDIT3 の Dialog Box のプロパティから [Want Return] と [Multi Line] を設定して下さい。
  3. 次のファイルをプロジェクトに追加します。
    RegEnum.cpp
    Script1.rc
    resource.h
  4. データの名前と登録する文字列をタイプして登録ボタンをクリックするとレジストリに登録されます。
  5. データの名前をタイプして削除ボタンをクリックするとレジストリから削除されます。
  6. 列挙ボタンをクリックすると登録されているエントリの一覧が EditBox に表示されます。

プログラムの説明

  1. hParentKey で「親のキー」を定義します。
    lpszSubKey で「サブキー」を定義します。
    szName[] は登録する(登録された)データの名前です。
    szText[] は登録する値と列挙したエントリを編集する領域です。
    buf は列挙したデータの編集領域です。
        #define     hParentKey HKEY_CURRENT_USER    //親キー
        #define     lpszSubKey "Software\\maeda"    //サブキー
    
        char        szName[40];
        char        szText[4096];
        char        buf[MAX_PATH];
        
  2. 「登録」ボタンがクリックされると szName[] と szText を EditBox から取得してレジストリに登録します。
        case IDC_PUT:
            GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
            GetDlgItemText(hDlg,IDC_EDIT2,szText,40);
            SetInitString(szName,szText);
            break;
        
  3. 「削除」ボタンがクリックされると szName[] を EditBox から取得して削除します。
        case IDC_DEL:
            GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
            DeleteReg(szName);
            break;
        
  4. 「列挙」ボタンがクリックされると登録されているエントリを列挙して EditBox に表示します。
        case IDC_ENUM:
            EnumReg();
            SetDlgItemText(hDlg,IDC_EDIT3,szText);
            break;
        
  5. レジストリに登録する関数は サブキーを作成して、文字列を登録 を参照して下さい。
  6. レジストリからエントリを削除する関数です。
    RegOpenKeyEx() でレジストリのキーのハンドルを取得します。
    RegDeleteValue() でエントリを削除します。
        // Registry からエントリを削除する
        void  DeleteReg(char *szName)
        {   HKEY    hKey;
    
            RegOpenKeyEx(hParentKey,    //親キー
                lpszSubKey,             //サブキー
                0,                      //常にゼロ
                KEY_ALL_ACCESS,         //セキュリティマスク
                &hKey);                 //キーのハンドル
            RegDeleteValue(hKey,        //キーのハンドル
                szName);                //削除するエントリの名前
            RegCloseKey(hKey);
            return;
        }
        
  7. レジストリのエントリを列挙する関数です。
    RegOpenKeyEx() でレジストリのキーのハンドルを取得します。
    RegEnumValue() でインデックス番号を指定してエントリ名を取得します。
    取得したエントリ名は、改行コードを付加して szText[] に編集します。
        // レジストリのエントリを列挙する
        void  EnumReg()
        {   HKEY    hKey;
            DWORD   dwIdx;
            DWORD   dwLen;
            LONG    lResult;
    
            RegOpenKeyEx(hParentKey,    //親キー
                lpszSubKey,             //サブキー
                0,                      //常にゼロ
                KEY_ALL_ACCESS,         //セキュリティマスク
                &hKey);                 //キーのハンドル
    
            szText[0]= '\0';
            for(dwIdx=0; ; dwIdx++)
            {   dwLen= sizeof(buf);
                lResult= RegEnumValue(
                    hKey,               //キーのハンドル
                    dwIdx,              //インデックス番号
                    buf,                //エントリ名が格納される領域
                    &dwLen,             //buf のサイズ
                    NULL,               //予約済み
                    NULL,               //データのタイプ
                    NULL,               //受け取る領域
                    NULL);              //受け取る領域のサイズ
                if(lResult!=ERROR_SUCCESS)  break;
                strcat(szText,buf);
                strcat(szText,"\r\n");
            }
            RegCloseKey(hKey);
            return;
        }
        

【全ソースコード】

/*★ Registry のエントリの列挙と削除    前田 稔 ★*/
#include    <windows.h>
#include    "resource.h"
#define     hParentKey HKEY_CURRENT_USER    //親キー
#define     lpszSubKey "Software\\maeda"    //サブキー

char        szName[40];
char        szText[4096];
char        buf[MAX_PATH];

// 関数のプロトタイプ宣言
LRESULT CALLBACK DialogProc( HWND, UINT, WPARAM, LPARAM );

// レジストリのエントリを列挙する
void  EnumReg()
{   HKEY    hKey;
    DWORD   dwIdx;
    DWORD   dwLen;
    LONG    lResult;

    RegOpenKeyEx(hParentKey,    //親キー
        lpszSubKey,             //サブキー
        0,                      //常にゼロ
        KEY_ALL_ACCESS,         //セキュリティマスク
        &hKey);                 //キーのハンドル

    szText[0]= '\0';
    for(dwIdx=0; ; dwIdx++)
    {   dwLen= sizeof(buf);
        lResult= RegEnumValue(
            hKey,               //キーのハンドル
            dwIdx,              //インデックス番号
            buf,                //エントリ名が格納される領域
            &dwLen,             //buf のサイズ
            NULL,               //予約済み
            NULL,               //データのタイプ
            NULL,               //受け取る領域
            NULL);              //受け取る領域のサイズ
        if(lResult!=ERROR_SUCCESS)  break;
        strcat(szText,buf);
        strcat(szText,"\r\n");
    }
    RegCloseKey(hKey);
    return;
}

// Registry からエントリを削除する
void  DeleteReg(char *szName)
{   HKEY    hKey;

    RegOpenKeyEx(hParentKey,    //親キー
        lpszSubKey,             //サブキー
        0,                      //常にゼロ
        KEY_ALL_ACCESS,         //セキュリティマスク
        &hKey);                 //キーのハンドル
    RegDeleteValue(hKey,        //キーのハンドル
        szName);                //削除するエントリの名前
    RegCloseKey(hKey);
    return;
}

// Registry に文字列を書き込む
void  SetInitString(char *szName, char *szData)
{
    HKEY    hKey;
    DWORD   dwPosition;
    LONG    lResult;

    RegCreateKeyEx(hParentKey,  //親キー
        lpszSubKey,             //サブキー
        0,                      //予約済み(0にする)
        "",                     //キーのクラス名
        REG_OPTION_NON_VOLATILE,//キーの記憶オプション
        KEY_ALL_ACCESS,         //キーアクセスのオプション
        NULL,                   //セキュリティ属性(NULLの時デフォルト)
        &hKey,                  //サブキーを受け取るバッファのポインタ
        &dwPosition);           //処理後の結果

    lResult= RegSetValueEx(
        hKey,                   //キーのハンドル
        szName,                 //設定する値の名前
        0,                      //予約済み(0にする)
        REG_SZ,                 //データのタイプ
        (BYTE *)szData,         //保存するデータへのポインタ
        lstrlen(szData));       //領域のバイト数

    RegCloseKey(hKey);
    return;
}

//★ Windows MAIN 関数
int  APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                      LPSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DialogProc);
    return TRUE;
}

//★ CALLBACK 関数
LRESULT  CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {   case IDC_PUT:
                    GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
                    GetDlgItemText(hDlg,IDC_EDIT2,szText,40);
                    SetInitString(szName,szText);
                    break;
                case IDC_DEL:
                    GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
                    DeleteReg(szName);
                    break;
                case IDC_ENUM:
                    EnumReg();
                    SetDlgItemText(hDlg,IDC_EDIT3,szText);
                    break;
                case IDCANCEL:
                    PostMessage(hDlg,WM_CLOSE,0,0);
                    return TRUE;
            }
            break;
        case WM_CLOSE:
            EndDialog(hDlg,TRUE); 
            return TRUE;
    }
    return FALSE;
}

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