Windows2000、VC++6.0です。
レジストリについて、教えてください。
以下のようにレジストリmykeyをオープンしました。
// レジストリオープン
lResult = ::RegCreateKeyEx( HKEY_CURRENT_USER,
myKey, 0, ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL,
&hkResult, &dwDisposition );
このレジストリmykeyに所属している値の名前と値の数(値が何個あるか?)は
どのように取得すればよいのでしょうか?
よろしくお願いします。
RegEnumKeyEx 関数を使えばよいのではないのでしょうか?
コンパイルは通していないので正しいコードかどうかは分かりませんが、こんな感じで使いま
す。
TCHAR lpszName[256]; // サブキー名を格納するバッファ。
DWORD dwNameSize = 256; // サブキー名を入れるバッファサイズ。
FILETIME ft; // サブキーの最終書き込み時刻
LONG lRes;
for ( DWORD i = 0;; i++ )
{
// 関数から処理が返ると、dwNameSize は格納した文字数に置き換わっているので、
// バッファサイズに初期化。
dwNameSize = 256;
lRes = ::RegEnumKeyEx(
hkResult,
i,
lpszName,
&dwNameSize,
NULL,
NULL,
NULL,
&ft
);
if ( lRes != ERROR_SUCCESS )
{
break;
}
// ここで取得したキー名を色々する。
}
// この時点で lRes に ERROR_NO_MORE_ITEMS が入っていたら、列挙成功。
Empty様 ありがとうございます。
まず...私の質問の仕方が悪くて申し訳ありませんでした。
Emptyさんの方法は、サブキーの列挙ですね。
私のやりたかったことは、値(MSDNにはレジストリエントリと書いてありました)の
列挙だったのです。
教えていただいたRegEnumKeyEx()をヒントに
RegEnumValue()を使用しました。
以下は、その部分の抜粋です。
おかげさまで解決しました。
ありがとうございました。<(_ _)>
--------------------------------------------------------------
// レジストリーキーに所属するレジストリエントリを列挙し、その値を取得する。
for ( DWORD dIndex = 0; ; dIndex++ )
{
dwNameSize = 256;
// レジストリエントリの列挙
lResult = ::RegEnumValue( hkResult,
dIndex,
szName,
&dwNameSize,
NULL,
&dwType,
NULL,
NULL);
if ( lResult == ERROR_NO_MORE_ITEMS )
{ // 列挙終了。値列挙のループを抜ける。
break;
}
if ( lResult != ERROR_SUCCESS )
{ // その他エラー
throw( ENUMREG );
}
// レジストリエントリの値取得
switch ( dwType )
{
case REG_DWORD: // 数値
lResult = ::RegQueryValueEx( hkResult,
szName,
NULL,
&dwType,
(LPBYTE)&dwNum,
&dwSize );
if ( lResult != ERROR_SUCCESS )
throw( GETNUM );
strMsg.Format( %d, dwNum );
AfxMessageBox( strMsg );
break;
case REG_SZ: // 文字列
lResult = ::RegQueryValueEx( hkResult,
szName,
NULL,
&dwType,
(LPBYTE)(LPCTSTR)strString,
&dwSize );
if ( lResult != ERROR_SUCCESS )
throw( GETSTRING );
AfxMessageBox( strString );
break;
default:
AfxMessageBox( その他のタイプ );
break;
}
}
