C语言轻松拿捏注册表

一、前言
注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件,注册表包含在Windows目录下两个文件system.dat和user.dat里,还有它们的备份system.dat和user.dat。注册表在系统中扮演着举足轻重的角色,可以说,系统大部分主流数据基本都存储在了注册表,我们可以通过对注册表操作来改变系统。所有代码链接均在文中,请大家按需下载。

二、认识注册表
我们都知道,打开注册表,一般可以直接在运行中输入命令打开,如图:

图片

然后回车就打开注册表了,如图:

图片

此时我们就可以根据自己的要求来修改里面的数据了。

三、C语言操作注册表
首当其冲的是老大哥C语言,它操作注册表的方法非常简单,直接调用win32api即可,一般有如下几个与注册表相关的操作函数,如下:

函数 说明
GetSystemRegistryQuota 检索注册表的当前大小以及允许注册表在系统上达到的最大大小。
RegCloseKey 关闭指定注册表项的句柄。
RegConnectRegistry 与另一台计算机上的预定义注册表句柄建立连接。
RegCopyTree 将指定的注册表项及其值和子项复制到指定的目标键。
RegCreateKeyEx 创建指定的注册表项。
RegCreateKeyTransacted 创建指定的注册表项并将其与事务相关联。
RegDeleteKey 删除子项及其值。
RegDeleteKeyEx 从注册表的指定平台特定视图中删除子项及其值。
RegDeleteKeyTransacted 从注册表的指定平台特定视图中删除子项及其值作为事务处理操作。
RegDeleteKeyValue 从指定的注册表项和子项中删除指定的值。
RegDeleteTree 以递归方式删除指定键的子项和值。
RegDeleteValue 从指定的注册表项中删除命名值。
RegDisablePredefinedCache 为当前进程的 HKEY_CURRENT_USER 禁用预定义注册表句柄的句柄缓存。
RegDisablePredefinedCacheEx 禁用当前进程的所有预定义注册表句柄的句柄缓存。
RegDisableReflectionKey 禁用指定项的注册表反射。
RegEnableReflectionKey 为指定的禁用项启用注册表反射。
RegEnumKeyEx 枚举指定打开的注册表项的子项。
RegEnumValue 枚举指定打开的注册表项的值。
RegFlushKey 将指定打开的注册表项的所有属性写入注册表。
RegGetKeySecurity 检索保护指定打开的注册表项的安全描述符的副本。
RegGetValue 检索指定注册表值的类型和数据。
RegLoadKey 在 HKEY_USERS 或 HKEY_LOCAL_MACHINE 下创建子项,并将指定文件中的注册信息存储在该子项中。
RegLoadMUIString 从指定的键和子项加载指定的字符串。
RegNotifyChangeKeyValue 通知调用方对指定注册表项的属性或内容的更改。
RegOpenCurrentUser 检索当前线程正在模拟的用户 HKEY_CURRENT_USER 密钥的句柄。
RegOpenKeyEx 打开指定的注册表项。
RegOpenKeyTransacted 打开指定的注册表项并将其与事务相关联。
RegOpenUserClassesRoot 检索指定用户的 HKEY_CLASSES_ROOT 键的句柄。
RegOverridePredefKey 将预定义的注册表项映射到指定的注册表项。
RegQueryInfoKey 检索有关指定注册表项的信息。
RegQueryMultipleValues 检索与打开的注册表项关联的值名称列表的类型和数据。
RegQueryReflectionKey 确定已为指定的键禁用或启用反射。
RegQueryValueEx 检索与打开的注册表项关联的指定值名称的类型和数据。
RegRenameKey 更改指定注册表项的名称。
RegReplaceKey 将支持注册表项的文件及其所有子项替换为另一个文件。
RegRestoreKey 读取指定文件中的注册表信息,并将其复制到指定的键上。
RegSaveKey 将指定的键及其所有子项和值保存到新文件中。
RegSaveKeyEx 将指定的键及其所有子项和值保存到新文件中。可以指定保存的密钥或配置单元的格式。
RegSetKeyValue 设置指定注册表项和子项中指定值的数据。
RegSetKeySecurity 设置打开的注册表项的安全性。
RegSetValueEx 设置注册表项下指定值的数据和类型。
RegUnLoadKey 从注册表中卸载指定的注册表项及其子项。
以下 shell 函数可与注册表一起使用:

AssocCreate

AssocQueryKey

AssocQueryString

AssocQueryStringByKey

SHCopyKey

SHDeleteEmptyKey

SHDeleteKey

SHDeleteValue

SHEnumKeyEx

SHEnumValue

SHGetValue

SHQueryInfoKey

SHQueryValueEx

SHRegCloseUSKey

SHRegCreateUSKey

SHRegDeleteEmptyUSKey

SHRegDeleteUSValue

SHRegDuplicateHKey

SHRegEnumUSKey

SHRegEnumUSValue

SHRegGetBoolUSValue

SHRegGetIntW

SHRegGetPath

SHRegGetUSValue

SHRegOpenUSKey

SHRegQueryInfoUSKey

SHRegQueryUSValue

SHRegSetPath

SHRegSetUSValue

SHRegWriteUSValue

SHSetValue

下面是初始化文件函数。它们从 中检索信息,并将信息复制到系统或应用程序定义的初始化文件中。提供这些函数只是为了与 16 位版本的 Windows 兼容。新应用程序应使用注册表。

函数 说明
GetPrivateProfileInt 检索与初始化文件的指定节中的键关联的整数。
GetPrivateProfileSection 检索初始化文件的指定节的所有键和值。
GetPrivateProfileSectionNames 检索初始化文件中所有节的名称。
GetPrivateProfileString 从初始化文件中的指定节检索字符串。
GetPrivateProfileStruct 检索与初始化文件的指定节中的键关联的数据。
GetProfileInt 从Win.ini文件的指定节中的键中检索整数。
GetProfileSection 检索Win.ini文件的指定节的所有键和值。
GetProfileString 检索与Win.ini文件的指定节中的键关联的字符串。
WritePrivateProfileSection 替换初始化文件中指定节的键和值。
WritePrivateProfileString 将字符串复制到初始化文件的指定节中。
WritePrivateProfileStruct 将数据复制到初始化文件的指定节中的键中。
WriteProfileSection 将 Win.ini 文件中指定节的内容替换为指定的键和值。
WriteProfileString 将字符串复制到Win.ini文件的指定节中。
已过时的函数
提供这些函数只是为了与 16 位版本的 Windows 兼容:

RegCreateKey

RegEnumKey

RegOpenKey

RegQueryValue

RegSetValue

(上述内容摘自MSDN)

下面我们分别从增删改查几个方面来具体讲解下C语言是如何操作注册表的。不过在操作之前,我们需要搞清楚注册表的各个根键的作用,如下:

根键 说明
HKEY_USERS 所有用户的账户信息
HKEY_LOCAL_MEACHIN 当前系统的信息
HKEY_CURRENT_USER 当前用户的信息,
HKEY_CLASSES_ROOT 保存文件关联和COM的设置信息
HKEY_CURRENT_CONFIG 有关当前硬件的配置信息
1.创建注册表
这里我们使用RegCreateKeyEx,它的参数如下:

LSTATUS RegCreateKeyEx(创建指定的注册表项。如果该项已存在,函数将打开它,如果函数成功,则返回值为 ERROR_SUCCESS。如果函数失败,则返回值为 Winerror.h 中定义的非零错误代码。可以将 FormatMessage 函数与 FORMAT_MESSAGE_FROM_SYSTEM 标志结合使用来获取错误的常规说明。

HKEYhKey 打开的注册表项的句柄。调用进程必须具有对密钥KEY_CREATE_SUB_KEY访问权限,根据注册表项的安全描述符(而不是获取句柄时指定的访问掩码)检查密钥创建访问权限。因此,即使 hKey 是使用 samDesired KEY_READ 打开的,它也可以用于修改注册表的操作(如果其安全描述符允许)。
此句柄由 RegCreateKeyEx 或 RegOpenKeyEx 函数返回,也可以是以下 预定义键之一:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

LPCSTR lpSubKey 此函数打开或创建的子项的名称。指定的子项必须是 由 hKey 参数标识的键的子项;它在注册表树中最多可以有 32 个级别。如果 lpSubKey 是指向空字符串的指针, 则 phkResult 接收 由 hKey 指定的键的新句柄。此参数不能为 NULL。

DWORD Reserved 此参数是保留的,必须为零

LPSTR lpClass 此键的用户定义类类型。此参数可以忽略。此参数可以为 NULL。

DWORD dwOptions
此参数的取值可为下列值之一:
值含义
REG_OPTION_BACKUP_RESTORE
0x00000004L
如果设置了此标志,函数将忽略 samDesired 参数,并尝试使用备份或还原密钥所需的访问权限打开密钥。如果调用线程启用了SE_BACKUP_NAME权限,则使用ACCESS_SYSTEM_SECURITY打开密钥,KEY_READ访问权限。如果调用线程启用了SE_RESTORE_NAME特权(从 Windows Vista 开始),则会使用ACCESS_SYSTEM_SECURITY、DELETE 和KEY_WRITE访问权限打开密钥。如果启用了这两个特权,则密钥具有这两个权限的组合访问权限。有关详细信息,请参阅使用特殊特权运行。

REG_OPTION_CREATE_LINK
0x00000002L
注意 注册表符号链接仅应用于 ,以在 绝对 必要的情况下实现应用程序兼容性。

此键是符号链接。目标路径分配给键的 L“SymbolicLinkValue”值。目标路径必须是绝对注册表路径。

REG_OPTION_NON_VOLATILE
0x00000000L
此键不是易失的;这是默认值。信息存储在文件中,并在系统重启时保留。RegSaveKey 函数保存非易失性的密钥。

REG_OPTION_VOLATILE
0x00000001L
函数创建的所有键都是可变的。此信息存储在内存中,并且在卸载相应的注册表配置单元时不保留此信息。对于 HKEY_LOCAL_MACHINE,仅当系统启动完全关闭时才会发生这种情况。对于 RegLoadKey 函数加载的注册表项,在执行相应的 RegUnLoadKey 时会发生这种情况。RegSaveKey 函数不保存易失性键。对于已存在的键,将忽略此标志。
注意 在用户选择关闭时,快速启动关闭是系统的默认行为。

REGSAM samDesired一个掩码,指定要创建的密钥的访问权限。

const LPSECURITY_ATTRIBUTES lpSecurityAttributes 指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的句柄是否可以由子进程继承。如果 lpSecurityAttributes 为 NULL,则不能继承句柄。

结构的 lpSecurityDescriptor 成员为新密钥指定安全描述符。如果 lpSecurityAttributes 为 NULL,则密钥将获取默认安全描述符。密钥的默认安全描述符中的 ACL 继承自其直接父密钥。

PHKEY phkResult 一个变量的指针,此变量指向已打开或已创建的项的句柄。如果项不是预定义的注册表项之一,请在使用完句柄后调用 RegCloseKey 函数。

LPDWORD lpdwDisposition 指向接收以下处置值之一的变量的指针。

值 含义
REG_CREATED_NEW_KEY
0x00000001L 密钥不存在且已创建。

REG_OPENED_EXISTING_KEY
0x00000002L 密钥已存在,并且只是打开而未更改。

如果 lpdwDisposition 为 NULL,则不返回任何处置信息。
(上述内容摘自MSDN)

对它的参数做了一番了解后,接下来我们就可以开始操作了,如图:

图片

其实这里我们还是用了一个设置注册表值和数据的函数RegSetValueEx,这个函数在修改注册表的时候也会用到,这里我们先来讲讲它的妙用,如下;

HKEY hKey 打开的注册表项的句柄。密钥必须已使用KEY_SET_VALUE访问权限打开
LPCSTR lpValueName 要设置的值的名称。如果键中尚不存在具有此名称的值,则函数会将其添加到键中。
如果 lpValueName 为 NULL 或空字符串“”,则该函数将设置键的未命名值或默认值的类型和数据。
DWORD Reserved 此参数是保留的,必须为零。
DWORD dwType lpData 参数指向的数据类型。有关可能类型的列表
const BYTE *lpData 要存储的数据。对于基于字符串的类型(如 REG_SZ),字符串必须以 null 结尾。对于 REG_MULTI_SZ 数据类型,字符串必须以两个 null 字符结尾。注意 lpData 指示 null 值有效,但是,如果是这种情况, cbData 必须设置为“0”。
DWORD cbData lpData 参数指向的信息的大小(以字节为单位)。如果数据的类型为 REG_SZ、REG_EXPAND_SZ 或 REG_MULTI_SZ, 则 cbData 必须包含终止 null 字符的大小。
如果函数成功,则返回值为 ERROR_SUCCESS。

如果函数失败,则返回值为 Winerror.h 中定义的非零错误代码。可以将 FormatMessage 函数与 FORMAT_MESSAGE_FROM_SYSTEM 标志结合使用来获取错误的常规说明。

(上述内容摘自MSDN)

创建.rar: https://url18.ctfile.com/f/7715018-960575847-971bed?p=6511 (访问密码: 6511)

2.修改注册表
想要修改注册表中某个值得数据,就得先打开这个注册表对应的主键和子键,这里要用到函数RegOpenKeyEx,用法如下:

HKEY hKey 打开的注册表项的句柄。此句柄由 RegCreateKeyEx 或 RegOpenKeyEx 函数返回,也可以是以下 预定义键之一:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
LPCSTR lpSubKey 要打开的注册表子项的名称。键名称不区分大小写。
如果 lpSubKey 参数为 NULL 或指向空字符串的指针,并且 hKey 是预定义键,则系统会刷新预定义的键,并且 phkResult 接收传递到函数中的同一 hKey 句柄。否则, phkResult 将接收打开的密钥的新句柄。
DWORD ulOptions指定要在打开密钥时应用的选项。将此参数设置为零或以下参数:
值含义
REG_OPTION_OPEN_LINK
键是符号链接。仅当绝对必要时才应使用注册表符号链
REGSAM samDesired 一个掩码,指定要打开的密钥的所需访问权限。如果密钥的安全描述符不允许对调用进程进行请求的访问,则函数将失败。
PHKEY phkResult 一个变量的指针,此变量指向已打开键的句柄。如果该键不是预定义的注册表项之一,请在使用完句柄后调用 RegCloseKey 函数。
如果函数成功,则返回值为 ERROR_SUCCESS。如果函数失败,则返回值为 Winerror.h 中定义的非零错误代码。(上述内容摘自MSDN),此时我们便可以进行修改操作了,如图:

图片

修改.rar: https://url18.ctfile.com/f/7715018-960575856-19494e?p=6511 (访问密码: 6511)

3.查找注册表
查找注册表需要用到函数RegQueryValueEx,它的用法如下:

HKEY hKey 打开的注册表项的句柄。密钥必须已使用KEY_QUERY_VALUE访问权限打开。
LPCSTR lpValueName 注册表值的名称。如果 lpValueName 为 NULL 或空字符串“”,则函数将检索键的未命名值或默认值的类型和数据(如果有)。如果 lpValueName 指定的值不在注册表中,则函数将返回ERROR_FILE_NOT_FOUND。键不会自动具有未命名值或默认值。未命名的值可以是任何类型的值。
LPDWORD lpReserved此参数是保留的,必须为 NULL。
LPDWORD lpType指向变量的指针,该变量接收指示存储在指定值中的数据类型的代码。有关可能的类型代码的列表,请参阅 注册表值类型。如果不需要类型代码, 则 lpType 参数可以为 NULL 。
LPBYTE lpData 指向接收值数据的缓冲区的指针。如果不需要数据,此参数可以为 NULL 。
LPDWORD lpcbData 指向变量的指针,该变量指定 lpData 参数指向的缓冲区的大小(以字节为单位)。当函数返回时,此变量包含复制到 lpData 的数据的大小。

仅当 lpData 为 NULL 时,lData 参数才能为 NULL。

如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,则此大小包括任何终止 null 字符或字符,除非数据存储时没有它们。有关详细信息,请参阅“备注”。
如果 lpData 参数指定的缓冲区不够大,无法保存数据,则函数将返回ERROR_MORE_DATA并将所需的缓冲区大小存储在 l ERROR_MORE_DATA Data 指向的变量中。在这种情况下, lpData 缓冲区的内容未定义。
如果 lpData 为 NULL,且 lData 为非 NULL,则该函数返回ERROR_SUCCESS,并将数据的大小(以字节为单位)存储在 l ERROR_SUCCESS Data 指向的变量中。这使应用程序能够确定为值的数据分配缓冲区的最佳方式。
如果 hKey 指定 HKEY_PERFORMANCE_DATA 并且 lpData 缓冲区不够大,无法包含所有返回的数据, 则 RegQueryValueEx 将返回ERROR_MORE_DATA,并且通过 lusbData 参数返回的值未定义。这是因为性能数据的大小可能会从一次调用更改为下一个调用。在这种情况下,必须增加缓冲区大小,并再次调用 RegQueryValueEx ,并在 lusbData 参数中传递更新的缓冲区大小。重复此操作,直到函数成功。你需要保留一个单独的变量来跟踪缓冲区大小,因为 lData 返回的值不可预知。
如果 lpValueName 注册表值不存在, 则 RegQueryValueEx 将返回ERROR_FILE_NOT_FOUND,并且通过 lusbData 参数返回的值未定义。
如果函数成功,则返回值为 ERROR_SUCCESS。

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

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

如果 lpValueName 注册表值不存在,该函数将返回ERROR_FILE_NOT_FOUND。

(上述内容摘自MSDN),知道怎么用了之后,我们就可以查询注册表的值了,如图:

图片

查找.rar: https://url18.ctfile.com/f/7715018-960575838-97f1c1?p=6511 (访问密码: 6511)

4.删除注册表
删除注册表算是这几个函数中使用最简单的了,这里有两个函数,一个RegDeleteKey,用法如下:

HKEY hKey 打开的注册表项的句柄。此密钥的访问权限不会影响删除操作。
lpSubKey 要删除的文件的名称。它必须是 hKey 标识的项的子项,但它不能具有子项。此参数不能为 NULL。函数使用 DELETE 访问权限打开子项。键名称不区分大小写。

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

如果函数失败,则返回值为 Winerror.h 中定义的非零错误代码。若要获取错误的一般说明,可以将 FormatMessage 函数与 FORMAT_MESSAGE_FROM_SYSTEM 标志一起使用。
它相当于是直接删除子健及其值,还有一个函数RegDeleteKeyEx,它可以从注册表的指定平台特定视图中删除子项及其值,用法如下:

HKEY hKey打开的注册表项的句柄。此密钥的访问权限不会影响删除操作
LPCSTR lpSubKey 要删除的文件的名称。此键必须是 由 hKey 参数的值指定的键的子项。
函数使用 DELETE 访问权限打开子项。键名称不区分大小写。此参数的值不能为 NULL。
REGSAM samDesired 访问掩码 指定注册表的特定于平台的视图。

值 含义
KEY_WOW64_32KEY
0x0200 从 32 位注册表视图中删除项。
KEY_WOW64_64KEY
0x0100 从 64 位注册表视图中删除项。
DWORD Reserved 此参数是保留的,必须为零。

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

如果函数失败,则返回值为 Winerror.h 中定义的非零错误代码。可以将 FormatMessage 函数与 FORMAT_MESSAGE_FROM_SYSTEM 标志结合使用来获取错误的常规说明。(上述内容摘自MSDN)
图片

删除.rar: https://url18.ctfile.com/f/7715018-960575853-07346f?p=6511 (访问密码: 6511)

5.枚举注册表
1).枚举子键
这里需要用到函数RegEnumKeyEx,其用法如下;

HKEY hKey打开的注册表项的句柄。必须已使用KEY_ENUMERATE_SUB_KEYS访问权限打开密钥
DWORD dwIndex要检索的子项的索引。首次调用 RegEnumKeyEx 函数时,此参数应为零,然后针对后续调用递增。由于子项未排序,因此任何新子项都将具有任意索引。这意味着函数可以按任意顺序返回子项。
LPSTR lpName 指向接收子项名称(包括终止 null 字符)的缓冲区的指针。函数仅将子项的名称(而不是完整键层次结构)复制到缓冲区。如果函数失败,则不会将任何信息复制到此缓冲区。
LPDWORD lpcchName 指向变量的指针,该变量指定 由 lpName 参数指定的缓冲区的大小(以字符为单位)。此大小应包含终止 null 字符。如果函数成功, 则 lpcchName 指向的变量包含缓冲区中存储的字符数,不包括终止 null 字符。若要确定所需的缓冲区大小,请使用 RegQueryInfoKey 函数确定 由 hKey 参数标识的键的最大子项的大小。
LPDWORD lpReserved 此参数是保留的,必须为 NULL。
LPSTR lpClass 指向接收枚举子项的用户定义类的缓冲区的指针。此参数可以为 NULL。
LPDWORD lpcchClass 指向变量的指针,该变量指定 由 lpClass 参数指定的缓冲区的大小(以字符为单位)。大小应包括终止 null 字符。如果函数成功, 则 lpcchClass 包含缓冲区中存储的字符数,不包括终止 null 字符。仅当 lpClass 为 NULL 时,此参数才能为 NULL。
PFILETIME lpftLastWriteTime 指向 FILETIME 结构的指针,该结构接收上次写入枚举子项的时间。此参数可以为 NULL。

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

如果函数失败,则返回值为 系统错误代码。如果没有其他可用的子项,函数将返回ERROR_NO_MORE_ITEMS。

如果 lpName 缓冲区太小而无法接收密钥的名称,则函数将返回ERROR_MORE_DATA。
(上述内容摘自MSDN)

图片

枚举子键.rar: https://url18.ctfile.com/f/7715018-960575868-be64ea?p=6511 (访问密码: 6511)

2).枚举值
这里需要用到函数RegEnumValue,其用法如下;

HKEY hKey打开的注册表项的句柄。密钥必须已使用KEY_QUERY_VALUE访问权限打开
DWORD dwIndex 要检索的值的索引。对于第一次调用 RegEnumValue 函数,此参数应为零,然后在后续调用中递增。由于值未排序,因此任何新值都将具有任意索引。这意味着该函数可以按任意顺序返回值。
LPSTR lpValueName 指向缓冲区的指针,该缓冲区接收以 null 结尾的字符串形式的值名称。
此缓冲区必须足够大,才能包含终止 null 字符。
LPDWORD lpcchValueName 指向变量的指针,该变量指定 lpValueName 参数指向的缓冲区的大小(以字符为单位)。当函数返回时,变量接收存储在缓冲区中的字符数,不包括终止 null 字符。如果 lpValueName 指定的缓冲区不够大,无法容纳数据,则函数将返回ERROR_MORE_DATA并且 lpValueName 指向的变量中的缓冲区大小不会更改。在这种情况下, 未定义 lpcchValueName 的内容。注册表值名称限制为 32,767 个字节。此函数的 ANSI 版本将此参数视为 SHORT 值。因此,如果指定的值大于 32,767 个字节,则存在溢出,函数可能会返回ERROR_MORE_DATA。
LPDWORD lpReserved 此参数是保留的,必须为 NULL。
LPDWORD lpType 指向变量的指针,该变量接收指示存储在指定值中的数据类型的代码。有关可能的类型代码的列表,请参阅 注册表值类型。如果不需要类型代码, 则 lpType 参数可以为 NULL 。
LPBYTE lpData 指向接收值条目数据的缓冲区的指针。如果不需要数据,此参数可以为 NULL 。如果 lpData 为 NULL 且 l中的应用数据 为非 NULL,则该函数会将数据的大小(以字节为单位)存储在 l中的应用数据(以字节为单位)。这使应用程序能够确定为数据分配缓冲区的最佳方式。
LPDWORD lpcbData 指向变量的指针,该变量指定 lpData 参数指向的缓冲区的大小(以字节为单位)。当函数返回时,变量接收存储在缓冲区中的字节数。仅当 lpData 为 NULL 时,此参数才能为 NULL。如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,则此大小包括任何终止 null 字符或字符。有关详细信息,请参阅“备注”。
如果 lpData 指定的缓冲区不够大,无法容纳数据,则函数将返回ERROR_MORE_DATA并将所需的缓冲区大小存储在 l ERROR_MORE_DATA Data 指向的变量中。在这种情况下, lpData 的内容未定义。
如果函数成功,则返回值为 ERROR_SUCCESS。

如果函数失败,则返回值为 系统错误代码。如果没有其他可用值,该函数将返回ERROR_NO_MORE_ITEMS。

如果 lpValueName 或 lpData 指定的缓冲区太小而无法接收值,则函数将返回ERROR_MORE_DATA。
(上述内容摘自MSDN)

图片

枚举值.rar: https://url18.ctfile.com/f/7715018-960575865-70da80?p=6511 (访问密码: 6511)

四、结语

欢迎大家持续关注我的公众号“”简易编程网“”,最新文章首发公众号,点个在看,你们的支持是我创作的不竭动力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_30852573

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值