サブキーを作成して、文字列を登録



VC++ でレジストリにサブキーを新規作成して、RegSetValueEx() 関数で文字列を登録します。

レジストリは REGEDIT.EXE を使って簡単に編集することができます。
[スタート/ファイル名を指定して実行] から REGEDIT.EXE をタイプして起動して下さい。
上の画面は実行結果を確かめるために、REGEDIT.EXE で HKEY_CURRENT_USER\Software\maeda を表示しています。

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

プロジェクトの作成

  1. 空の新規プロジェクト(PutString)を作成して下さい。
  2. DialogBox を作成して EditControl を配置して下さい。
    BOX ID 説明
    DialogBox IDD_DIALOG1
    EditControl IDC_EDIT1 登録する名前
    EditControl IDC_EDIT2 登録する値
    Button IDOK 登録を実行
    Button IDCANCEL 終了
  3. 次のファイルをプロジェクトに追加します。
    PutString.cpp
    Script1.rc
    resource.h
  4. ビルド(コンパイル)に続いて実行を行います。
  5. EditBox に登録する名前(test)をタイプして下さい。
    EditBox に登録する値(maeda minoru)をタイプして下さい。
    「OK」ボタンをクリックするとレジストリに登録されて、メッセージボックスが表示されます。
  6. 実行の確認はページ先頭の画像を参考に REGEDIT.EXE で行って下さい。

プログラムの説明

  1. hParentKey で「親のキー」を定義します。
    lpszSubKey で「サブキー」を定義します。
    szName[40] は登録するデータの名前です。
    szText[40] は登録する値の領域です。
        #define     hParentKey HKEY_CURRENT_USER    //親キー
        #define     lpszSubKey "Software\\maeda"    //サブキー
    
        char        szName[40];
        char        szText[40];
        
  2. 「OK」ボタンがクリックされると szName[] と szText[] を EditBox から取得してレジストリに登録します。
    登録が終わるとメッセージボックスで完了を知らせます。
        {   case IDOK:
                GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
                GetDlgItemText(hDlg,IDC_EDIT2,szText,40);
                if (SetInitString(szName,szText)==TRUE)
                        MessageBox(hDlg,szText,"記録しました",MB_OK);
                else    MessageBox(hDlg,szText,"失敗しました",MB_OK);
                break;
        
  3. レジストリにサブキーを新規作成して、文字列を登録する関数です。
    1. RegCreateKeyEx() でレジストリにサブキーを作成して、そのハンドルを取得します。
      既に作成されているときは、そのハンドルが返されます。
              LRESULT  SetInitString(char *szName, char *szData)
              {
                  HKEY    hKey;
                  DWORD   dwPosition;
                  LONG    lResult;
      
                  lResult= RegCreateKeyEx(
                      hParentKey,             //親キー
                      lpszSubKey,             //サブキー
                      0,                      //予約済み(0にする)
                      "",                     //キーのクラス名
                      REG_OPTION_NON_VOLATILE,//キーの記憶オプション
                      KEY_ALL_ACCESS,         //キーアクセスのオプション
                      NULL,                   //セキュリティ属性(NULLの時デフォルト)
                      &hKey,                  //サブキーを受け取るバッファのポインタ
                      &dwPosition);           //処理後の結果
                  if (lResult!=ERROR_SUCCESS) return FALSE;
              
    2. ハンドルが取得できると RegSetValueEx() で szName の名前で szData を登録します。
      RegCloseKey() でハンドルをクローズして下さい。
                  lResult= RegSetValueEx(
                      hKey,                   //キーのハンドル
                      szName,                 //設定する値の名前
                      0,                      //予約済み(0にする)
                      REG_SZ,                 //データのタイプ
                      (BYTE *)szData,         //保存するデータへのポインタ
                      lstrlen(szData));       //領域のバイト数
                  RegCloseKey(hKey);
                  if (lResult!=ERROR_SUCCESS) return FALSE;
                  return TRUE;
              }
              

【全ソースコード】

/*★ Registry にサブキーを設定して文字列を書き込む   前田 稔 ★*/
#include    <windows.h>
#include    "resource.h"
#define     hParentKey HKEY_CURRENT_USER    //親キー
#define     lpszSubKey "Software\\maeda"    //サブキー

char        szName[40];
char        szText[40];

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

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

    lResult= RegCreateKeyEx(
        hParentKey,             //親キー
        lpszSubKey,             //サブキー
        0,                      //予約済み(0にする)
        "",                     //キーのクラス名
        REG_OPTION_NON_VOLATILE,//キーの記憶オプション
        KEY_ALL_ACCESS,         //キーアクセスのオプション
        NULL,                   //セキュリティ属性(NULLの時デフォルト)
        &hKey,                  //サブキーを受け取るバッファのポインタ
        &dwPosition);           //処理後の結果
    if (lResult!=ERROR_SUCCESS) return FALSE;
    lResult= RegSetValueEx(
        hKey,                   //キーのハンドル
        szName,                 //設定する値の名前
        0,                      //予約済み(0にする)
        REG_SZ,                 //データのタイプ
        (BYTE *)szData,         //保存するデータへのポインタ
        lstrlen(szData));       //領域のバイト数
    RegCloseKey(hKey);
    if (lResult!=ERROR_SUCCESS) return FALSE;
    return TRUE;
}

//★ 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 IDOK:
                    GetDlgItemText(hDlg,IDC_EDIT1,szName,40);
                    GetDlgItemText(hDlg,IDC_EDIT2,szText,40);
                    if (SetInitString(szName,szText)==TRUE)
                            MessageBox(hDlg,szText,"記録しました",MB_OK);
                    else    MessageBox(hDlg,szText,"失敗しました",MB_OK);
                    break;
                case IDCANCEL:
                    PostMessage(hDlg,WM_CLOSE,0,0);
                    return TRUE;
            }
            break;
        case WM_CLOSE:
            EndDialog(hDlg,TRUE); 
            return TRUE;
    }
    return FALSE;
}

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