レジストリの文字列を読む



VC++ の RegQueryValueEx() 関数でレジストリに登録されている文字列を入力します。

レジストリには、OSの情報は元よりアプリケーションプログラムの動作に必要な情報が格納されています。
Windows 95/98/Me では \Windows\System\system.dat に Windows NT/2000/XP では \WinNT\System32\Config の フォルダーに格納されています。
レジストリが壊れると悲惨なことになるので慎重に扱って下さい。(^_^;

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

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

プロジェクトの作成

  1. ページの先頭で表示した @nifty の CommonPath に格納されている文字列を表示してみましょう。
  2. 空の新規プロジェクト(GetString)を作成して下さい。
  3. DialogBox を作成して EditControl を配置して下さい。
    BOX ID
    DialogBox IDD_DIALOG1
    EditControl IDC_EDIT1
    Button IDOK
    Button IDCANCEL
  4. 次のファイルをプロジェクトに追加します。
    GetString.cpp
    Script1.rc
    resource.h
  5. ビルド(コンパイル)に続いて実行を行います。
    「OK」ボタンをクリックするとレジストリに記録されている文字列が EditBox に表示されます。
    レジストリから取得する文字列は、次のソースコードで指定しています。
    ページ先頭のレジストリが記録されていない時は、この部分を変更して下さい。
    幾つかの例を示します。
    #define     hParentKey HKEY_CURRENT_USER    //親キー
    #define     lpszSubKey "Software\\@nifty"   //サブキー
    
                GetRegString("CommonPath",szText);
    
    #define     hParentKey HKEY_CURRENT_USER         //親キー
    #define     lpszSubKey "Control Panel\\Current"  //サブキー
    
                GetRegString("Color Schemes",szText);
    
    #define     hParentKey HKEY_CURRENT_USER                   //親キー
    #define     lpszSubKey "AppEvents\\EventLabels\\.Default"  //サブキー
    
                GetRegString("DispFileName",szText);
    

プログラムの説明

  1. hParentKey で「親のキー」を定義します。
    lpszSubKey で「サブキー」を定義します。
    szText[40] は取得した文字列を格納する領域です。
        #define     hParentKey HKEY_CURRENT_USER    //親キー
        #define     lpszSubKey "Software\\@nifty"   //サブキー
    
        char        szText[40];
        
  2. 「OK」ボタンがクリックされると GetRegString() で文字列を取得して EditBox に表示します。
        {   case IDOK:
                GetRegString("CommonPath",szText);
                SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),szText);
                break;
        
  3. Registry から文字列を読み出す関数です。
    1. RegOpenKeyEx() でレジストリのキーのハンドルを取得します。
              void  GetRegString(char *szName, char *szValue)
              {
                  HKEY    hKey;
                  DWORD   dwType = REG_SZ;
                  DWORD   dwByte = 32;
                  LONG    rc;
      
                  rc= RegOpenKeyEx(
                      hParentKey,             //親キー
                      lpszSubKey,             //サブキー
                      0,                      //常にゼロ
                      KEY_ALL_ACCESS,         //セキュリティマスク
                      &hKey);                 //キーのハンドル
                  if (rc!=ERROR_SUCCESS)
                  {   strcpy(szValue,"*** RegOpenKeyEx Error");
                      return;
                  }
              
    2. RegQueryValueEx() で szName に対応する文字列を取得します。
      RegCloseKey() でハンドルをクローズして下さい。
                  rc= RegQueryValueEx(
                      hKey,                   //キーのハンドル
                      szName,                 //読み取るキーの名前
                      NULL,                   //常に NULL
                      &dwType,                //データのタイプ
                      (BYTE *)szValue,        //受け取る領域
                      &dwByte);               //領域のバイト数(受け取ったバイト数)
                  RegCloseKey(hKey);
                  if (rc!=ERROR_SUCCESS)  strcpy(szValue,"***RegQueryValueEx Error");
                  return;
              }
              

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

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