APIでレジストリを操作する簡単な方法

レジストリとはWindowsが用意しているプログラムの情報を保存するためのデータベースです。 拡張子の関連付けからウィンドウサイズの設定保存に至るまで多岐に渡って使用されています。 ユーザ別に設定を保存しなければならない場合にもレジストリを使用すれば簡単に実装できます。Windows95以降では基本的にレジストリに設定を保存することが望ましいとされています。20年以上に渡って現役であるレジストリの操作方法を覚えておいて損はありません。

DWORD値をレジストリに設定する

// レジストリ設定 (DWORD)
// 
// [引数]
// root : HKEY_CLASS_ROOT等 (WinReg.hを参照)
// path : レジストリのパス情報
// key  : レジストリのキー
// dwNewValue : 設定値
// 
// [返値]
// 書き込み成功 : TRUE
// 書き込み失敗 : FALSE

BOOL SetRegValue(HKEY root, char *path, char *key, DWORD dwNewValue)
{
    HKEY hRegKey;
    DWORD dwDisp;
    BOOL bRet = FALSE;

    hRegKey = NULL;

    if (RegCreateKeyEx(    root, path, NULL, "", REG_OPTION_NON_VOLATILE,
                        KEY_ALL_ACCESS, NULL, &hRegKey, &dwDisp) == ERROR_SUCCESS) {
        if (RegSetValueEx(hRegKey, key, 0, REG_DWORD,
                         (LPBYTE)&dwNewValue, sizeof(DWORD)) == ERROR_SUCCESS) {
            bRet = TRUE;
        }
        RegCloseKey(hRegKey);
    }

    return bRet;
}

DWORD値をレジストリから取得する

// レジストリ取得 (DWORD)
//
// [引数]
// root : HKEY_CLASS_ROOT等 (WinReg.hを参照)
// path : レジストリのパス情報
// key  : レジストリのキー
// dwDefault : 取得できなかった場合のデフォルト値
// 
// [返値]
// 取得できた場合 : 取得値
// 取得できなかった場合 : 引数で指定したデフォルト値

DWORD GetRegValue(HKEY root, char *path, char *key, DWORD dwDefault)
{
    HKEY hRegKey;
    DWORD dwRet;
    DWORD dwType = REG_DWORD;
    DWORD dwBufferSize = sizeof(DWORD);

    hRegKey = NULL;
    dwRet = dwDefault; // RegOpenが失敗した場合の準備

    if (RegOpenKeyEx(root, path, 0, KEY_READ, &hRegKey) == ERROR_SUCCESS) {
        if (RegQueryValueEx(hRegKey, key, 0, &dwType,
                             (LPBYTE)&dwRet, &dwBufferSize) != ERROR_SUCCESS) {
            dwRet = dwDefault; // エラーの場合はデフォルト値
        }
        RegCloseKey(hRegKey);
    }

    return dwRet;
}

文字列をレジストリに設定する

// レジストリ設定 (テキスト)
// 
// [引数]
// root : HKEY_CLASS_ROOT等 (WinReg.hを参照)
// path : レジストリのパス情報
// key  : レジストリのキー
// szBuffer : 設定内容
// 
// [返値]
// 書き込み成功 : TRUE
// 書き込み失敗 : FALSE

BOOL SetRegText(HKEY root, char *path, char *key, char *szBuffer)
{
    HKEY hRegKey;
    DWORD dwDisp;
    DWORD dwLength;
    BOOL bRet = FALSE;

    hRegKey = NULL;
    dwLength = lstrlen(szBuffer);

    if (RegCreateKeyEx(    root, path, NULL, "", REG_OPTION_NON_VOLATILE,
                        KEY_ALL_ACCESS, NULL, &hRegKey, &dwDisp) == ERROR_SUCCESS) {
        if (RegSetValueEx(hRegKey, key, 0, REG_SZ,
                         (LPBYTE)szBuffer, dwLength) == ERROR_SUCCESS) {
            bRet = TRUE;
        }
        RegCloseKey(hRegKey);
    }

    return bRet;
}

文字列をレジストリから取得する

// レジストリ取得 (テキスト)
//
// [引数]
// root : HKEY_CLASS_ROOT等 (WinReg.hを参照)
// path : レジストリのパス情報
// key  : レジストリのキー
// szBuffer : 取得文字列を保存するためのバッファ
// dwBufferSize : バッファのサイズ
// szDefault : 取得できなかった場合のデフォルト文字列
// 
// [返値]
// 取得できた場合 : TRUE
// 取得できなかった場合 : FALSE

BOOL GetRegText(HKEY root, char *path, char *key,
                char *szBuffer, LPDWORD dwBufferSize, char *szDefault)
{
    HKEY hRegKey;
    BOOL bRet = FALSE;
    DWORD dwType = REG_SZ;

    hRegKey = NULL;
    lstrcpy(szBuffer, szDefault); // RegOpen関数の失敗時に備える

    if (RegOpenKeyEx(root, path, 0, KEY_READ, &hRegKey) == ERROR_SUCCESS) {
        if (RegQueryValueEx(hRegKey, key, 0, &dwType,
                             (LPBYTE)szBuffer, dwBufferSize) == ERROR_SUCCESS) {
            bRet = TRUE;
        } else { 
            lstrcpy(szBuffer, szDefault); // エラーの場合はデフォルト値
        }
        RegCloseKey(hRegKey);
    }

    return bRet;
}

レジストリを削除する

// レジストリの値を削除する
// 
// [引数]
// root : HKEY_CLASS_ROOT等 (WinReg.hを参照)
// path : レジストリのパス情報
// key  : レジストリのキー
// 
// [返値]
// 削除成功 : TRUE
// 削除失敗 : FALSE

BOOL DeleteRegValue(HKEY root, char *path, char *key)
{
    HKEY hRegKey;
    BOOL bRet = FALSE;

    if (RegOpenKeyEx(root, path, 0, KEY_ALL_ACCESS, &hRegKey) == ERROR_SUCCESS) {
        if (RegDeleteValue(hRegKey, key) == ERROR_SUCCESS) {
            bRet = TRUE;
        }
    }

    return bRet;
}

 

Windows API

Posted by @erestage