LSTATUS RegGetValueW(
  [in]                HKEY    hkey,
  [in, optional]      LPCWSTR lpSubKey,
  [in, optional]      LPCWSTR lpValue,
  [in, optional]      DWORD   dwFlags,
  [out, optional]     LPDWORD pdwType,
  [out, optional]     PVOID   pvData,
  [in, out, optional] LPDWORD pcbData

[in] hkey

打开的注册表项的句柄。 密钥必须已使用KEY_QUERY_VALUE访问权限打开。 有关详细信息,请参阅 注册表项安全和访问权限

此句柄由 RegCreateKeyExRegCreateKeyTransactedRegOpenKeyExRegOpenKeyTransacted 函数返回。 它也可以是以下 预定义键之一:

HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_PERFORMANCE_DATA
HKEY_PERFORMANCE_NLSTEXT
HKEY_PERFORMANCE_TEXT
HKEY_USERS

[in, optional] lpSubKey

相对于 hkey 参数指定的项的注册表项的路径。 将从此子项检索注册表值。

路径不区分大小写。

如果此参数为 NULL 或空字符串“”,则将从 hkey 本身指定的键中读取该值。

[in, optional] lpValue

注册表值的名称。

如果此参数为 NULL 或空字符串“”,则该函数将检索键的未命名值或默认值的类型和数据(如果有)。 键不会自动具有未命名值或默认值,且未命名的值可以是任何类型的。

有关详细信息,请参阅 注册表元素大小限制

[in, optional] dwFlags

限制要查询的值的数据类型的标志。 如果值的数据类型不符合此条件,则函数将失败。 此参数可使用以下一个或多个值。

RRF_RT_ANY
0x0000ffff
无类型限制。 如果 lpSubKey 不为 NULL,请使用KEY_WOW64_64KEY访问权限打开 lpSubKey 指定的子项。 有关这些访问权限的信息,请参阅 注册表项安全性和访问权限

不能与 RRF_SUBKEY_WOW6432KEY 一起指定 RRF_SUBKEY_WOW6464KEY

如果 lpSubKey 不为 NULL,请使用KEY_WOW64_32KEY访问权限打开 lpSubKey 指定的子项。 有关这些访问权限的信息,请参阅 注册表项安全性和访问权限

不能与 RRF_SUBKEY_WOW6464KEY 一起指定 RRF_SUBKEY_WOW6432KEY

[out, optional] pdwType

指向变量的指针,该变量接收指示存储在指定值中的数据类型的代码。 有关可能的类型代码的列表,请参阅 注册表值类型。 如果类型不是必需的,此参数可以为 NULL

[out, optional] pvData

指向接收值数据的缓冲区的指针。 如果不需要数据,此参数可以为 NULL

如果数据是字符串,则该函数会检查终止 null 字符。 如果未找到该字符串,则如果缓冲区足够大,足以容纳多余字符,则会使用 null 终止符存储字符串。 否则,函数将失败并返回ERROR_MORE_DATA。

[in, out, optional] pcbData

指向变量的指针,该变量指定 pvData 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时,此变量包含复制到 pvData 的数据的大小。

仅当 pvDataNULL,该参数才能为 NULL

如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,则此大小包括任何终止 null 字符或字符。 有关详细信息,请参阅“备注”。

如果 pvData 参数指定的缓冲区不够大,无法容纳数据,则函数将返回ERROR_MORE_DATA并将所需的缓冲区大小存储在 由ERROR_MORE_DATA data 指向的变量中。 在这种情况下,如果 dwFlags 指定RRF_ZEROONFAILURE,则 pvData 缓冲区的内容为零,否则为未定义。

如果 pvDataNULL,且 ERROR_SUCCESS非 NULL,则该函数将返回,并将数据的大小(以字节为单位)存储在 由data 指向的变量中。 这使应用程序能够确定为值的数据分配缓冲区的最佳方式。

如果 hKey 指定 HKEY_PERFORMANCE_DATA 并且 pvData 缓冲区不够大,无法包含所有返回的数据,则函数将返回ERROR_MORE_DATA,并且未定义通过 httpData 参数返回的值。 这是因为性能数据的大小可能会从一次调用更改为下一个调用。 在这种情况下,必须增加缓冲区大小,并再次调用 RegGetValue ,并在 参数中 传递更新的缓冲区大小。 重复此操作,直到函数成功。 你需要维护一个单独的变量来跟踪缓冲区大小,因为 由Data 返回的值不可预知。

如果函数成功,则返回值为 ERROR_SUCCESS。

如果函数失败,则返回值为 系统错误代码

如果 pvData 缓冲区太小而无法接收值,则函数将返回ERROR_MORE_DATA。

如果 lpValue 注册表值不存在,则函数返回ERROR_FILE_NOT_FOUND。

如果 dwFlags 同时指定 RRF_SUBKEY_WOW6464KEYRRF_SUBKEY_WOW6432KEY的组合,则函数返回ERROR_INVALID_PARAMETER。

应用程序通常调用 RegEnumValue 来确定值名称,然后 调用 RegGetValue 来检索名称的数据。

如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,并且此函数的 ANSI 版本通过显式调用 RegGetValueA 或在将 Windows.h 文件) 之前不定义 UNICODE 来 (使用,则此函数会将存储的 Unicode 字符串转换为 ANSI 字符串,然后再将其复制到 pvData 指向的缓冲区。

在将 hkey 设置为 HKEY_PERFORMANCE_DATA 句柄和指定对象的值字符串的情况下调用此函数时,返回的数据结构有时具有未请求的对象。 不要感到惊讶:这是正常行为。 应始终希望遍历返回的数据结构以查找请求的对象。

请注意,将重定向访问某些注册表项的操作。 有关详细信息,请参阅 注册表虚拟化注册表中的 32 位和 64 位应用程序数据

若要编译使用此函数的应用程序,请将_WIN32_WINNT定义为 0x0600 或更高版本。 有关详细信息,请参阅 使用 Windows 标头

winreg.h 标头将 RegGetValue 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定