RegEnumValue

https://msdn.microsoft.com/ja-jp/library/ms724884.aspx https://msdn.microsoft.com/ja-jp/library/cc428939.aspx

指定された 1 つのレジストリキーに所属するレジストリエントリを列挙します。この関数を 1 回呼び出すたびに、1 つのレジストリエントリの名前とそれに対応するデータ(レジストリエントリのデータ)を取得します。

レジストリエディタ(Regedt32.exe または Regedit.exe)は、ここで言う「レジストリエントリ」を「値」(英語版は Value)と呼んでいます。どちらも同じものを意味していて、「名前」(レジストリエントリ名)と「データ」(レジストリエントリのデータ)で構成されています。

LONG RegEnumValue(
  HKEY hKey,             // 問い合わせ対象のキーのハンドル
  DWORD dwIndex,         // 取得するべきレジストリエントリのインデックス番号
  LPTSTR lpValueName,    // レジストリエントリ名が格納されるバッファ
  LPDWORD lpcValueName,  // レジストリエントリ名バッファのサイズ
  LPDWORD lpReserved,    // 予約済み
  LPDWORD lpType,        // レジストリエントリのデータのタイプ
  LPBYTE lpData,         // レジストリエントリのデータが格納されるバッファ
  LPDWORD lpcbData       // データバッファのサイズ
);

パラメータ

hKey
現在開いているキーのハンドルを指定します。代わりに、あらかじめ定義されている次の予約済みハンドルのいずれかを指定することもできます。

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 も指定できます。

hKey パラメータで指定したキーに関連付けられているレジストリエントリが列挙されます。

dwIndex
取得するべきレジストリエントリのインデックス番号を指定します。最初にこの関数を呼び出すときは、0 を指定します。そして、次の呼び出し時は 1、その次は 2 と、1 つずつ増やしていきます。

レジストリエントリはインデックス番号の順に配置されているわけではないので、新しいレジストリエントリを作成した場合、任意のインデックス番号が割り当てられます(現在の最大のインデックス番号に 1 を足した値とは限りません)。言い換えると、この関数で指定したインデックス番号と、返されるレジストリエントリの間に直接の関係はなく、実行してみるまでは、どのレジストリエントリが返されるのかわかりません。

lpValueName
1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、レジストリエントリの名前が格納されます(終端の NULL 文字を含む)。
lpcValueName
lpValueName パラメータが指すバッファのサイズ(終端の NULL 文字を含む)を TCHAR 単位で保持している、1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、lpValueName パラメータが指すバッファに格納された文字数が格納されます(終端の NULL 文字を除く)。
lpReserved
予約されています。NULL を指定してください。
lpType
1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、レジストリエントリのデータ型が格納されます。データ型のコードを次に示します。同じものが、MSDN ライブラリの「」にも掲載されています(英語)。この情報が不要な場合、NULL を指定します。
意味
REG_BINARY 任意の形式のバイナリデータです。
REG_DWORD 32 ビット値です。
REG_DWORD_LITTLE_ENDIAN リトルエンディアン形式の 32 ビット値です。REG_DWORD と同じことを意味します。

リトルエンディアン形式では、マルチバイトデータをメモリ内に格納する際に、最下位バイト(リトルエンド)から最上位バイトの順で格納します。たとえば、0x12345678 という値をリトルエンディアン形式で格納すると、0x78 0x56 0x34 0x12 という順序になります。

Windows NT/2000 と Windows 95/98 は、リトルエンディアンのコンピュータアーキテクチャで動作するよう設計されています(x86 は当初、8 ビットプロセッサの 8085 との互換性を保つために可変長データを採用したので、最下位から順にアクセスする方が都合が良いと言われていました)。しかし、多くの UNIX システムのように、ビッグエンディアン形式のアーキテクチャを採用しているコンピュータと接続をすることもあるので、データの交換などを行う際に注意が必要です。

REG_DWORD_BIG_ENDIAN ビッグエンディアン形式の 32 ビット値です。

ビッグエンディアン形式では、マルチバイトデータをメモリ内に格納する際に、最上位バイト(ビッグエンド)から最下位バイトの順で格納します。たとえば、0x12345678 という値をビッグエンディアン形式で格納すると、0x12 0x34 0x56 0x78 という順序になります。

REG_EXPAND_SZ 環境変数の展開前の表記("%PATH%" など)を保持している、NULL で終わる文字列です。Unicode 版の関数を使っているときは Unicode 文字列、ANSI 版の関数を使っているときは ANSI 文字列が格納されます。環境変数の表記を展開するには、ExpandEnvironmentStrings 関数を使ってください。
REG_LINK Unicode のシンボリックリンクです。内部で使われます。アプリケーションは、このタイプを使うべきではありません。
REG_MULTI_SZ NULL で終わる複数の文字列からなる 1 つの配列です。配列の最後にもう 1 つの NULL 文字が追加されます。
REG_NONE レジストリエントリの未定義のタイプです。
REG_QWORD 64 ビット値です(quadruple word)。
REG_QWORD_LITTLE_ENDIAN リトルエンディアン形式の 64 ビット値です。REG_QWORD と同じことを意味します。
REG_RESOURCE_LIST デバイスドライバのリソースリストです。
REG_SZ NULL で終わる文字列です。Unicode 版の関数を使っているときは Unicode 文字列、ANSI 版の関数を使っているときは ANSI 文字列が格納されます。

lpData
1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、レジストリエントリのデータが格納されます。この情報が不要な場合、NULL を指定します。
lpcbData
lpData パラメータが指すバッファのサイズをバイト単位で保持している、1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、lpData パラメータが指すバッファに格納されたバイト数が格納されます。lpData パラメータで NULL を指定した場合に限って、lpcbData パラメータで NULL を指定できます。

戻り値

関数が成功すると、ERROR_SUCCESS が返ります。

関数が失敗すると、Winerror.h ヘッダーファイル内で定義されている、0 以外の値が返ります。FORMAT_MESSAGE_FROM_SYSTEM フラグを指定して 関数を呼び出すと、エラーの一般的な説明を取得できます。

解説

レジストリエントリを列挙するには、最初は dwIndex パラメータで 0 を指定して RegEnumValue 関数を呼び出します。以後、dwIndex をインクリメントして(1 増やして)RegEnumValue 関数を呼び出します。すべてのレジストリエントリが列挙されるまで(関数が ERROR_NO_MORE_ITEMS を返すまで)この操作を繰り返します。

通常とは逆の順番で列挙を行うには、最初に dwIndex パラメータで最後のレジストリエントリのインデックス番号を指定して RegEnumValue 関数を呼び出します。以後、dwIndex をデクリメントして(1 減らして)RegEnumValue 関数を呼び出します。dwIndex が 0 になるまでこの操作を繰り返します。最後のレジストリエントリのインデックス番号を取得するには、RegQueryInfoKey 関数を使います。

RegEnumValue 関数の使用中は、列挙対象のレジストリエントリを変更する可能性のあるレジストリ関数を呼び出さないでください。

hKey パラメータで指定するキーは、KEY_QUERY_VALUE アクセス権を指定して開いたものでなければなりません。(KEY_READ アクセス権には、KEY_QUERY_VALUE アクセス権が含まれているので、代わりに KEY_READ アクセス権を指定して開いてもかまいませんを含んでいます)。キーを開くには、RegCreateKeyEx 関数または RegOpenKeyEx 関数を使います。

レジストリエントリ名バッファや、レジストリエントリのデータが格納されるバッファの最大サイズを取得するには、RegQueryInfoKey 関数を使います。

Windows 95/98:レジストリのサブキー名、およびレジストリエントリ名の長さは、最大 255 文字です。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winreg.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Advapi32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

RegCreateKeyEx, RegEnumKey, RegEnumKeyEx, RegOpenKeyEx, RegQueryInfoKey

表示: