○レジストリ操作


開く→操作→閉じる が一連の動作です。
REG_OPTION_NON_VOLATILE:不揮発性で開いたり、REG_OPTION_VOLATILE:揮発性で開いたりするのをごちゃ混ぜにすると、どんどん書き換えられてわけわからなくなるので注意が必要です。←あたりまえかw
デバッグの時に揮発性で作ってリリースで不揮発性に変更した時に、レジストリの読み出し部分でふと変更をわすれていると地獄

○レジストリのキーを作成または既存のキーを開く


HKEY hKey;
DWORD dwDisposition;
LONG result;
result = RegCreateKeyEx( HKEY_CURRENT_USER,
				//HKEY_CLASSES_ROOT
				//HKEY_CURRENT_CONFIG
				//HKEY_CURRENT_USER
				//HKEY_LOCAL_MACHINE
				//HKEY_USERS
				//Windows NT/2000:HKEY_PERFORMANCE_DATA も指定できます。
				//Windows 95/98:HKEY_DYN_DATA も指定できます。
			"Software\\AAAA\\BBBB",//キー
			0,//予約
			NULL,//指定
			REG_OPTION_NON_VOLATILE,//不揮発性
				//REG_OPTION_VOLATILE //システムを再起動すると消える揮発性
			KEY_ALL_ACCESS,//標準アクセス権)のすべての権利を組み合わせたもの
			NULL,
			&hKey,
			&dwDisposition);
//result が ERROR_SUCCESS であれば成功である.

//キーを閉じる
RegCloseKey(hKey);



○レジストリの値の設定

■文字を書き込む

char data[]="DDDD";
result = RegSetValueEx(
	hKey,	// 現在オープンしているキーのハンドル
	"test",	// 値の「名前」が入った文字列へのポインタ
	0,	// 予約パラメータ。0を指定する
	REG_SZ,	// 値の「種類」を指定する。NULLで終わる文字列はREG_SZ、32ビット値はREG_DWORD
	(CONST BYTE*)(LPCTSTR)data,	// 格納する値の「データ」が入ったバッファへのポインタ
	(int)sizeof(data)		// dataのサイズを指定する
);



■数字を書き込む

int data=100;
result = RegSetValueEx(
	hKey,	// 現在オープンしているキーのハンドル
	"test",	// 値の「名前」が入った文字列へのポインタ
	0,	// 予約パラメータ。0を指定する
	REG_DWORD,	// 値の「種類」を指定する。NULLで終わる文字列はREG_SZ、32ビット値はREG_DWORD
	(CONST BYTE*)&data,	// 格納する値の「データ」が入ったバッファへのポインタ
	(int)sizeof(data)	// dataのサイズを指定する
);




○レジストリの値の取得

■文字の取得

一回サイズを取得してからデータを取得するらしい(ほんとなのかな?

char Data[1024]="";	// 値を受け取る
DWORD dwType;		// 値の種類を受け取る
DWORD dwSize;		// データのサイズを受け取る
//データのサイズを取得
result = RegQueryValueEx(
	hKey,	// 現在オープンしているキーのハンドル
	"test",	// 取得する値の「名前」が入った文字列へのポインタ
	NULL,	// 予約パラメータ。NULLを指定する
	&dwType,	// 値の「種類」を受け取る
	NULL,		// 値の「データ」を受け取る。NULLを指定することも可能だが、データは受け取れない
	&dwSize		// 終端文字'\0'を含んだDataのサイズを取得する
);
//実際にデータを取得(サイズの指定が正しくないと失敗することがある)
result = RegQueryValueEx(
	hKey,	// 現在オープンしているキーのハンドル
	"test",	// 取得する値の「名前」が入った文字列へのポインタ
	NULL,	// 予約パラメータ。NULLを指定する
	&dwType,	// 値の「種類」を受け取る
	(LPBYTE)(LPCTSTR)&Data,	// 値の「データ」を受け取る。NULLを指定することも可能だが、データは受け取れない
	&dwSize		// Dataのサイズを指定する
);



■値の取得

サイズを受け取るdwSizeのポインタは必要らしいからNULLを指定しないのが吉。


DWORD Data;	// "データのポインタアドレスを受け取る
DWORD dwSize=(int)sizeof(Data);	// データのサイズ

result = RegQueryValueEx(
	hKey,	// 現在オープンしているキーのハンドル
	"test",	// 取得する値の「名前」が入った文字列へのポインタ
	NULL,	// 予約パラメータ。NULLを指定する
	NULL,	// 値の「種類」を受け取る
	(LPBYTE)&Data,	// 値の「データ」を受け取る。NULLを指定することも可能だが、データは受け取れない
	&dwSize		// Dataのサイズを指定する。
);




▲トップページ > Windows と C++