- レジストリキーの新規作成またはオープン
- レジストリキーを新規に作成するか、既存のキーをオープンするにはRegCreateKeyEx関数を使う。
以下に、この関数の定義を示す。
LONG RegCreateKeyEx(
HKEY hKey, // 現在オープンしているキーまたは定義済みキーのハンドル
LPCTSTR lpSubKey, // サブキーの名前が入った文字列へのポインタ
DWORD Reserved, // 予約パラメータ。0を指定する
LPTSTR lpClass, // キーのクラスが入った文字列へのポインタ。通常は""でよい
DWORD dwOptions, // オプション。通常はREG_OPTION_NON_VOLATILEで問題ない
REGSAM samDesired, // セキュリティのアクセスマスク。通常はKEY_ALL_ACCESSでよい
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // ハンドルの子プロセスへの継承指定
PHKEY phkResult, // オープン、作成されたキーのハンドルを受け取る
LPDWORD lpdwDisposition // 処理結果(新規作成されたか既存のキーをオープンしたか)を受け取る
);
次に、RegCreateKeyEx関数の使用例を示す。この例では、
定義済みキーであるHKEY_CURRENT_USERの下にMyDataというキーを作成し、
さらにその下にAddressというキーが作成される。
HKEY hkResult; // キーのハンドル
DWORD dwDisposition; // 処理結果を受け取る
LONG lResult; // 関数の戻り値を格納する
lResult = ::RegCreateKeyEx(HKEY_CURRENT_USER, "MyData\\Address", 0, "",
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkResult, &dwDisposition);
if( lResult != ERROR_SUCCESS )
{
// エラー処理
}
- レジストリキーのクローズ
- レジストリキーをクローズするには、RegCloseKey関数を使う。使用例は以下のとおり。
::RegCloseKey(hkResult);
- レジストリの値の設定
- オープンしたレジストリキーの中に値を設定するには、RegSetValueEx関数を使う。
以下に、この関数の定義を示す。
LONG RegSetValueEx(
HKEY hKey, // 現在オープンしているキーのハンドル
LPCTSTR lpValueName, // 値の「名前」が入った文字列へのポインタ
DWORD Reserved, // 予約パラメータ。0を指定する
DWORD dwType, // 値の「種類」を指定する。NULLで終わる文字列はREG_SZ、32ビット値はREG_DWORD
CONST BYTE *lpData, // 格納する値の「データ」が入ったバッファへのポインタ
DWORD cbData // lpDataのサイズを指定する
);
次に、RegSetValueEx関数の使用例を示す。この例では、先にオープンしたレジストリキー
「HKEY_CURRENT_USER\MyData\Address」の下に、「CityName」と「PostalNumber」という名前をもった2つの値を設定する。
「CityName」は"Yokohama"という文字列、「PostalNumber」は2200001という数値のデータである。
CString strCity = "Yokohama";
DWORD dwPostalNum = 2200001;
::RegSetValueEx(hkResult, "CityName", 0, REG_SZ, (CONST BYTE*)(LPCTSTR)strCity, strCity.GetLength() + 1);
::RegSetValueEx(hkResult, "PostalNumber", 0, REG_DWORD, (CONST BYTE*)&dwPostalNum, sizeof(dwPostalNum));
- レジストリの値の取得
- オープンしたレジストリキーの中から値を取得するには、RegQueryValueEx関数を使う。
以下に、この関数の定義を示す。
LONG RegQueryValueEx(
HKEY hKey, // 現在オープンしているキーのハンドル
LPTSTR lpValueName, // 取得する値の「名前」が入った文字列へのポインタ
LPDWORD lpReserved, // 予約パラメータ。NULLを指定する
LPDWORD lpType, // 値の「種類」を受け取る
LPBYTE lpData, // 値の「データ」を受け取る。NULLを指定することも可能だが、データは受け取れない
LPDWORD lpcbData // lpDataのサイズを指定する。関数実行後はlpDataにコピーされたデータのサイズになる
);
次に、RegQueryValueEx関数の使用例を示す。
ここで注目してほしいのは、同じ値に対して2度この関数を実行している点である。
1度目では5番目の引数にNULLを指定している。こうするとデータは受け取れないが、dwSizeにデータのサイズを取得することができる。
このようにデータのサイズを取得してから実際にデータを取得するとよい。(サイズの指定が正しくないと失敗することがある)
CString strCity2; // "CityName"のデータを受け取る
DWORD dwPostalNum2; // "PostalNumber"のデータを受け取る
DWORD dwType; // 値の種類を受け取る
DWORD dwSize; // データのサイズを受け取る
::RegQueryValueEx(hkResult, "CityName", NULL, &dwType, NULL, &dwSize);
::RegQueryValueEx(hkResult, "CityName", NULL, &dwType, (LPBYTE)(LPCTSTR)strCity2, &dwSize);
::RegQueryValueEx(hkResult, "PostalNumber", NULL, &dwType, NULL, &dwSize);
::RegQueryValueEx(hkResult, "PostalNumber", NULL, &dwType, (LPBYTE)&dwPostalNum2, &dwSize);
- レジストリの値とキーの削除
- オープンしたレジストリキーの値やキー自体を削除するには、RegDeleteValue関数やRegDeleteKey関数を使う。
以下に例を示す。
::RegDeleteValue(hkResult, "CityName");
::RegDeleteValue(hkResult, "PostalNumber");
::RegDeleteKey(HKEY_CURRENT_USER, "MyData\\Address");
::RegDeleteKey(HKEY_CURRENT_USER, "MyData");