[C++] WinAPIを利用してレジストリ操作を行う


はじめに

C++は久しぶりに触ったのですが、やっぱり普段さわってないと忘れます。

C++でのレジストリ操作はWinAPIを利用します。

利用するWinAPIは下記の通りです。

  • RegOpenKeyEx

    • 指定されたレジストリキーをオープンします
  • RegCreateKeyEx

    • 指定されたレジストリキーを作成します。
  • RegSetValueEx

    • レジストリキーの下に指定された値のデータと型を設定します
  • RegQueryValueEx

    • 指定されたレジストリキーをオープンします。この関数は指定されたレジストリキーが存在しない場合はキーを作成しません。
  • RegCloseKey

    • 指定されたレジストリキーのハンドルを解放します

今回は、C++でのレジストリ操作についての備忘録です。

 

レジストリキー作成

使用しているWinAPI

  • RegCreateKeyEx
  • RegCloseKey
BOOL CreateRegistryKey(HKEY hKeyParent,PWCHAR subkey)
{
    DWORD dwDisposition; 
    HKEY  hKey;
    DWORD Ret;
    Ret = RegCreateKeyEx(
            hKeyParent,
            subkey,
            0,
            NULL,
            REG_OPTION_NON_VOLATILE,
            KEY_ALL_ACCESS,
            NULL,
            &hKey,
            &dwDisposition
        );

    if (Ret != ERROR_SUCCESS)
    {
        printf("Error opening or creating new key\n");
        return FALSE;
    }
    RegCloseKey(hKey); 
    return TRUE;
}

 

DWORD型の値をレジストリに書き込む

使用しているWinAPI

  • RegOpenKeyEx
  • RegSetValueEx
  • RegCloseKey
BOOL WriteInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD data)
{
    DWORD Ret;
    HKEY hKey;

    Ret = RegOpenKeyEx(
              hKeyParent,
              subkey,
              0,
              KEY_WRITE,
              &hKey
          );

    if (Ret == ERROR_SUCCESS)
    {
        if (ERROR_SUCCESS != RegSetValueEx(
            hKey, 
            valueName, 
            0, 
            REG_DWORD, 
            reinterpret_cast<BYTE *>(&data), 
            sizeof(data)))
        {
            RegCloseKey(hKey);
            return FALSE;
        }

        RegCloseKey(hKey);
        return TRUE;
    }
    return FALSE;
}

 

文字列をレジストリに書き込む

使用しているWinAPI

  • RegOpenKeyEx
  • RegSetValueEx
  • RegCloseKey
BOOL writeStringInRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR strData)
{
    DWORD Ret;
    HKEY hKey;

    Ret = RegOpenKeyEx(
              hKeyParent,
              subkey,
              0,
              KEY_WRITE,
              &hKey
          );

    if (Ret == ERROR_SUCCESS)
    {
        if (ERROR_SUCCESS != RegSetValueEx(
                    hKey,
                    valueName,
                    0,
                    REG_SZ,
                    (LPBYTE)(strData),
                    ((((DWORD)lstrlen(strData) + 1)) * 2)))
        {
            RegCloseKey(hKey);
            return FALSE;
        }
        RegCloseKey(hKey);
        return TRUE;
    }
    return FALSE;
}

 

DWORD型データを読み込み

使用しているWinAPI

  • RegOpenKeyEx
  • RegQueryValueEx
  • RegCloseKey
BOOL readDwordValueRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, DWORD *readData)
{
    HKEY hKey;
    DWORD Ret;

    Ret = RegOpenKeyEx(
              hKeyParent,
              subkey,
              0,
              KEY_READ,
              &hKey
          );
    if (Ret == ERROR_SUCCESS)
    {
        DWORD data;
        DWORD len = sizeof(DWORD);
        Ret = RegQueryValueEx(
                  hKey,
                  valueName,
                  NULL,
                  NULL,
                  (LPBYTE)(&data),
                  &len
              );
        if (Ret == ERROR_SUCCESS)
        {
            RegCloseKey(hKey);
            (*readData) = data;
            return TRUE;
        }
        RegCloseKey(hKey);
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

 

文字列データを読み込み

使用しているWinAPI

  • RegOpenKeyEx
  • RegQueryValueEx
  • RegCloseKey
BOOL readStringFromRegistry(HKEY hKeyParent, PWCHAR subkey, PWCHAR valueName, PWCHAR *readData)
{
    HKEY hKey;
    DWORD len = TOTAL_BYTES_READ;
    DWORD readDataLen = len;
    PWCHAR readBuffer = (PWCHAR )malloc(sizeof(PWCHAR)* len);
    if (readBuffer == NULL)
        return FALSE;

    DWORD Ret = RegOpenKeyEx(
                    hKeyParent,
                    subkey,
                    0,
                    KEY_READ,
                    &hKey
                );
    if (Ret == ERROR_SUCCESS)
    {
        Ret = RegQueryValueEx(
                  hKey,
                  valueName,
                  NULL,
                  NULL,
                  (BYTE*)readBuffer,
                  &readDataLen
              );
        while (Ret == ERROR_MORE_DATA)
        {
            len += OFFSET_BYTES;
            readBuffer = (PWCHAR)realloc(readBuffer, len);
            readDataLen = len;
            Ret = RegQueryValueEx(
                      hKey,
                      valueName,
                      NULL,
                      NULL,
                      (BYTE*)readBuffer,
                      &readDataLen
                  );
        }
        if (Ret != ERROR_SUCCESS)
        {
            RegCloseKey(hKey);
            return false;;
        }
        *readData = readBuffer;
        RegCloseKey(hKey);
        return true;
    }
    else
    {
        return false;
    }
}

 

最後に

C#とかに慣れると、C++ではちょっと面倒ですね。

是非参考になればと思います。

 

参考