DWORD の登録と読み出し



VC++ の RegSetValueEx() 関数でレジストリに DWORD のデータを登録をします。
次に RegQueryValueEx() で登録されたデータを読み出して表示します。

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

プロジェクトの作成

  1. 空の新規プロジェクトを作成して下さい。
  2. ページ先頭の画像を参考にして DialogBox を作成して下さい。
    BOX ID 説明
    DialogBox IDD_DIALOG1
    EditControl IDC_EDIT1 データの名前
    EditControl IDC_EDIT2 登録する値
    EditControl IDC_EDIT3 読み出した値
    Button IDC_PUT 登録
    Button IDC_GET 読み出し
    Button IDCANCEL 終了
  3. 次のファイルをプロジェクトに追加します。
    RegGetPut.cpp
    Script1.rc
    resource.h
  4. データの名前と登録する値をタイプして登録ボタンをクリックするとレジストリに登録されます。
  5. データの名前をタイプして読み出しボタンをクリックすると登録されている値が EditBox に表示されます。
    登録されていない名前を指定するとエラーが表示されます。

プログラムの説明

  1. hParentKey で「親のキー」を定義します。
    lpszSubKey で「サブキー」を定義します。
    szName[40] は登録する(登録された)データの名前です。
    szText[40] は DWORD を編集する領域です。
    dwVal は登録する(登録された)データの格納領域です。
        #define     hParentKey HKEY_CURRENT_USER    //親キー
        #define     lpszSubKey "Software\\maeda"    //サブキー
    
        char        szName[40];
        char        szText[40];
        DWORD       dwVal;
        
  2. 「登録」ボタンがクリックされると szName[] と dwVal を EditBox から取得してレジストリに登録します。
        case IDC_PUT:
            GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
            dwVal= GetDlgItemInt(hDlg,IDC_EDIT2,NULL,FALSE);
            SetInitDWORD(szName,dwVal);
            break;
        
  3. 「読み出し」ボタンがクリックされると szName[] を取得してレジストリから読み出して EditBox に表示します。
    エラーのときは "Registry Get Error" を表示します。
        LONG    rc;
    
        case IDC_GET:
            GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
            rc= GetRegDWORD(szName,&dwVal);
            if(rc==ERROR_SUCCESS)   wsprintf(szText,"%d",dwVal);
            else    strcpy(szText,"Registry Get Error");
            SetDlgItemText(hDlg,IDC_EDIT3,szText);
            break;
        
  4. レジストリに登録されている DWORD のデータを読み出す関数です。
    RegOpenKeyEx() でレジストリのキーのハンドルを取得します。
    RegQueryValueEx() で szName に対応する DWORD を取得します。
        // Registry から DWORD を読み出す
        LONG GetRegDWORD(char *szName, DWORD *dwValue)
        {   HKEY    hKey;
            DWORD   dwType = REG_DWORD;
            DWORD   dwByte = 32;
            LONG    lResult;
    
            RegOpenKeyEx(hParentKey,    //親キー
                lpszSubKey,             //サブキー
                0,                      //常にゼロ
                KEY_ALL_ACCESS,         //セキュリティマスク
                &hKey);                 //キーのハンドル
    
            lResult= RegQueryValueEx(
                hKey,                   //キーのハンドル
                szName,                 //読み取るキーの名前
                NULL,                   //常に NULL
                &dwType,                //データのタイプ
                (BYTE *)dwValue,        //受け取る領域
                &dwByte);               //領域のバイト数(受け取ったバイト数)
            RegCloseKey(hKey);
            return lResult;
        }
        
  5. レジストリにサブキーを新規作成して DWORD を登録する関数です。
    RegCreateKeyEx() でレジストリにサブキーを作成して、そのハンドルを取得します。
    既に作成されているときは、そのハンドルが返されます。
    RegSetValueEx() で szName の名前で dwData を登録します。
        // Registry に DWORD を書き込む
        void SetInitDWORD(char *szName, DWORD dwData)
        {   HKEY    hKey;
            DWORD   dwPosition;
    
            RegCreateKeyEx(hParentKey,  //親キー
                lpszSubKey,             //サブキー
                0,                      //予約済み(0にする)
                "",                     //キーのクラス名
                REG_OPTION_NON_VOLATILE,//キーの記憶オプション
                KEY_ALL_ACCESS,         //キーアクセスのオプション
                NULL,                   //セキュリティ属性(NULLの時デフォルト)
                &hKey,                  //サブキーを受け取るバッファのポインタ
                &dwPosition);           //処理後の結果
    
            RegSetValueEx(hKey,         //キーのハンドル
                szName,                 //設定する値の名前
                0,                      //予約済み(0にする)
                REG_DWORD,              //データのタイプ
                (BYTE *)&dwData,        //保存するデータへのポインタ
                sizeof(DWORD));         //領域のバイト数
    
            RegCloseKey(hKey);
            return;
        }
        

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