RegQueryValueEx

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

指定されたレジストリキーに所属している、指定されたレジストリエントリのデータ型とデータを取得します。

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

LONG RegQueryValueEx(
  HKEY hKey,            // キーのハンドル
  LPCTSTR lpValueName,  // レジストリエントリ名
  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 も指定できます。

lpValueName
問い合わせ対象のレジストリエントリの名前を保持している、NULL で終わる文字列へのポインタを指定します。

NULL または空の文字列を指定した場合、この関数は、hKey パラメータで指定したキーに所属する名前なしのレジストリエントリ(<No Name>、日本語版では <名前なし>)、または「(標準)」のレジストリエントリのデータ型とデータを取得します(これらのレジストリエントリが存在する場合に限ります)。

Windows 95/98:どのキーにも、既定のレジストリエントリが 1 個所属しています。このレジストリエントリは名前が「(標準)」で、何もデータを保持していません。レジストリエディタでは、「(値の設定なし)」と表示されています。Windows 95 では、既定のデータ型は必ず REG_SZ になっています。Windows 98 では、キー内の既定のレジストリエントリのデータ型は、最初は REG_SZ ですが、RegSetValueEx 関数を使うと、既定のレジストリエントリに他のデータ型を割り当てるよう指定することもできます。

Windows NT/2000:キーには <名前なし> や既定のレジストリエントリは存在しません。名前なしのレジストリエントリを作成した場合、任意のデータ型を割り当てることができます。

lpReserved
予約されています。NULL を指定してください。
lpType
1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、レジストリエントリのデータ型が格納されます。データ型のコードについては、RegEnumValue 関数の表を参照してください。同じものが、MSDN ライブラリの「」にも掲載されています(英語)。データ型が不要な場合、NULL を指定します。
lpData
1 個のバッファへのポインタを指定します。関数から制御が返ると、このバッファに、レジストリエントリのデータが格納されます。この情報が不要な場合、NULL を指定します。
lpcbData
lpData パラメータで指定したバッファのサイズをバイト単位で保持している、1 個の変数へのポインタを指定します。関数から制御が返ると、この変数に、lpData バッファへコピーされたデータのサイズが格納されます。

データ型が REG_SZ、REG_MULTI_SZ、REG_EXPAND_SZ のいずれかである場合、終端の NULL が含まれます。

lpData パラメータで NULL を指定した場合に限って、lpcbData パラメータで NULL を指定できます。

lpData パラメータが指すバッファのサイズが不足して、一部のデータを格納できない場合、この関数は ERROR_MORE_DATA を返し、lpcbData パラメータが指す変数に、必要なサイズがバイト単位で格納されます。この場合、lpData パラメータが指すバッファの内容は未定義です。

lpData パラメータでに NULL を指定し、lpcbData パラメータで NULL 以外の値を指定すると、この関数は ERROR_SUCCESS を返し、lpcbData パラメータが指す変数にデータのサイズが格納されます。この結果、アプリケーションはレジストリエントリのデータを格納するために最適なバッファのサイズを取得できます。

Window NT:hKey パラメータで HKEY_PERFORMANCE_DATA を指定したときに、lpData パラメータが指すバッファが小さすぎる場合、RegQueryValueEx 関数は ERROR_MORE_DATA を返しますが、lpcbData パラメータが指す変数には、必要なバッファのサイズが格納されません。これは、パフォーマンスデータのサイズが、最初にこの関数を呼び出したときと、次にこの関数を呼び出すときとで変化している可能性があるからです。この場合、バッファのサイズを増やし、更新後のサイズを lpcbData パラメータで指定して、もう一度 RegQueryValueEx 関数を呼び出さなければなりません。最適なサイズを事前に把握することはできないので、関数が成功するまで、この手順を繰り返してください。バッファのサイズを記録するために、もう 1 個変数を用意する必要があります。lpcbData パラメータが指す変数に格納される値は、予測できないからです。

戻り値

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

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

解説

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

レジストリエントリのデータが REG_SZ、REG_MULTI_SZ、REG_EXPAND_SZ のいずれかのデータ型である場合、この関数の ANSI 版を呼び出すと(明示的に RegQueryValueExA 関数を呼び出すか、Windows.h ファイルをインクルードする前に UNICODE を定義しない)、この関数はそのレジストリエントリのデータを、lpData パラメータが指すバッファへコピーする前に、格納済みの Unicode 文字列を ANSI 文字列へ変換します。

Window NT/2000:hKey パラメータで HKEY_PERFORMANCE_DATA ハンドルを指定し、lpValueName パラメータで希望のオブジェクトを表す文字列を指定して RegQueryValueEx 関数を呼び出すと、バッファに格納されたデータ構造体に、要求していないオブジェクトが共に格納されることがあります。しかし、これはエラーではなく、現時点でのこの関数の通常の動作です。RegQueryValueEx 関数を呼び出した場合、バッファに格納されたデータ構造体をプログラマがウォークして(全体を検討して)、要求したオブジェクトを見つける必要があります。

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 版を実装

参照

ExpandEnvironmentStrings, RegCreateKeyEx, RegEnumKey, RegEnumKeyEx, RegEnumValue, RegOpenKeyEx, RegQueryInfoKey, RegQueryValue

表示: