SDKを使ったレジストリ操作

レジストリ操作をより詳細におこなうには、MFCではなくSDKを直接使用する。
レジストリにはキーで構成される。キーはディレクトリのようなもので、 階層構造になっている。これに対し値はファイルのようなもので、 名前、種類、データの3つの情報から成り立っている。
レジストリのキーは階層構造になっていると述べたが、 ルートになるキーはあらかじめ定義されており、HKEY_CLASSES_ROOT、HKEY_CURRENT_USERなどいくつか存在する。
レジストリキーの新規作成またはオープン
レジストリキーを新規に作成するか、既存のキーをオープンするには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");

目次へ