Windows注册表基本操作

注册表和文件的操作差不多,也存在打开,关闭,写入,查询等操作,使用的所有API函数皆以Reg开头。

1. 打开和关闭注册表

对注册表操作前,需通过API函数打开注册表,并返回用于操作注册表的句柄,通过此句柄,来对注册表进行读写操作。

打开注册表
LONG RegOpenKeyEx(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey,  // address of name of subkey to open
  DWORD ulOptions,   // reserved
  REGSAM samDesired, // security access mask
  PHKEY phkResult    // address of handle to open key
);

在Win16下,还有一个RegOpenKey()函数,如今虽仍可使用,但RegOpenKeyEx()兼容性更好。

打开注册表,实质是打开注册表的某一个子键,然后进行操作。

参数说明:
  • hKey:指定一个父键句柄。
  • lpSubKey:指向一个字符串,用来表示要打开的子键名称。
  • ulOptions:系统保留,必须为0。
  • samDesired:打开注册表的存取权限,通常为KEY_ALL_ACCESS。
  • phkResult:指向一个双子变量,用来接收打开的子键句柄。
Return Value:
  • succeed:返回ERROR_SUCCEDD,并在phkResult中保存返回打开子键的句柄。

操作完注册表后,也需要关闭句柄以释放资源。函数如下:

LONG RegCloseKey(
    HKEY hKey  //handle to key to close
);


2. 创建和删除子键

创建子键
LONG RegCreateKeyEx(
  HKEY hKey,                // handle to an open key
  LPCTSTR lpSubKey,         // address of subkey name
  DWORD Reserved,           // reserved
  LPTSTR lpClass,           // address of class string
  DWORD dwOptions,          // special options flag
  REGSAM samDesired,        // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                            // address of key security structure
  PHKEY phkResult,          // address of buffer for opened handle
  LPDWORD lpdwDisposition   // address of disposition value buffer
);

当需要创建的子键以存在时,该函数与RegOpenKeyEx()函数的作用相同。

参数说明:
  • hKey:指定父键句柄。
  • lpSubKey:指向一个字符串,用来表示要打开的子键名称。
  • Reserved:系统保留,必须为0。
  • lpClass:子键类名,常为NULL。
  • dwOptions:创建子键时的选项,通常使用REG_OPTION_NON_VOLATILE,表示创建的子键被创建到注册表文件中,而非内存。
  • samDesired:打开注册表的存取权限,通常为KEY_ALL_ACCESS即可。
  • lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构体,用来指定安全属性,常为NULL。
  • phkResult:指向一个双子变量,用来接收打开的子键句柄。
  • lpdwDisposition:常为NULL。
Return Value:
  • succeed:返回ERROR_SUCCESS,并在phkResult中保存返回创建子键的句柄。

删除子键
LONG RegDeleteKey(
    HKEY hKey,          //父键句柄
    LPCTSTR lpSubKey    //指向要删除的子键名称字符串
);

该函数的值能用来删除键值项,即函数只能删除最下一层的子键。


3. 查询、写入与删除

读取键名称中的数据或查询键名称的属性,使用此函数:

LONG RegQueryValueEx(
  HKEY hKey,           // handle to key to query
  LPTSTR lpValueName,  // address of name of value to query
  LPDWORD lpReserved,  // reserved
  LPDWORD lpType,      // address of buffer for value type
  LPBYTE lpData,       // address of data buffer
  LPDWORD lpcbData     // address of data buffer size
);
参数说明:
  • hKey:指定要读取的键值项所处的子键句柄。
  • lpValueName:指定要读取的键值项的名称。
  • lpReserved:保留,常为NULL。
  • lpType:接收返回的键值类型,若不需返回键值类型,可为NULL。
  • lpData:指向一个缓冲区,用来接收返回的键值数据。
  • lpcbData:调用该函数时,此参数用来指定缓冲区的长度;函数返回时,该变量保存缓冲区实际接收到的长度。

写入键值项
LONG RegSetValueEx(
  HKEY hKey,           // handle to key to set value for
  LPCTSTR lpValueName, // name of the value to set
  DWORD Reserved,      // reserved
  DWORD dwType,        // flag for value type
  CONST BYTE *lpData,  // address of value data
  DWORD cbData         // size of value data
);
参数说明:
  • hKey:指定要写入的键值所处的子键句柄。
  • lpValueName:指向定义键值项名称的字符串。
  • Reserved:保留,必须为0.
  • dwType:要写入的键值数据的类型。
  • lpData:要写入键值数据的缓冲区。
  • cbData:要写入键值数据的缓冲区长度。

删除键值项
LONG RegDeleteValue(
    HEKY hKey,             //指定删除的句柄
    LPCTSTR lpValueName    //被删除键值项的名称
);


4. 子键和键值的枚举

枚举即逐一获取。子键的枚举对指定键下的子键进行逐一获取。键值的枚举是对指定子键下的键值进行逐一获取。

枚举子键
LONG RegEnumKeyEx(
  HKEY hKey,          // handle to key to enumerate
  DWORD dwIndex,      // index of subkey to enumerate
  LPTSTR lpName,      // address of buffer for subkey name
  LPDWORD lpcbName,   // address for size of subkey buffer
  LPDWORD lpReserved, // reserved
  LPTSTR lpClass,     // address of buffer for class string
  LPDWORD lpcbClass,  // address for size of class buffer
  PFILETIME lpftLastWriteTime 
                      // address for time key last written to
);
参数说明:
  • hKey:指定被枚举的键句柄。
  • dwIndex:指定需要返回信息的子键索引编号。
  • lpName:用户接收返回子键名称的缓冲区。
  • lpcName:调用该函数前,该参数保存lpName指向缓冲区的长度;调用完成后,该参数保存缓冲区实际接收到的数据的长度。
  • lpReserved:保存参数,必须为NULL。
  • lpClass:一般为NULL。
  • lpcbClass:一般为NULL。
  • lpftLastWriteTime:指向一个FILETIME结构体,用于接收最后一次被写入的时间。

枚举键值
LONG RegEnumValue(
  HKEY hKey,              // handle to key to query
  DWORD dwIndex,          // index of value to query
  LPTSTR lpValueName,     // address of buffer for value string
  LPDWORD lpcbValueName,  // address for size of value buffer
  LPDWORD lpReserved,     // reserved
  LPDWORD lpType,         // address of buffer for type code
  LPBYTE lpData,          // address of buffer for value data
  LPDWORD lpcbData        // address for size of data buffer
);
参数说明:
  • hKey:指定被枚举的键句柄。
  • dwIndex:指定需要返回信息的键值索引编号。
  • lpValueName:用户接收返回键值名称的缓冲区。
  • lpcbValueName:调用前,保存lpValueName指向缓冲区的长度;调用后,保存缓冲区实际接收到的数据的长度。
  • lpReserved:保存参数,必须为NULL。
  • lpType:指向一个用于返回键值数据类型的双字变量。
  • lpData:用户接收返回键值数据的缓冲区。
  • lpcbData:调用前,保存lpData指向缓冲区的长度;调用后,保存实际收到的数据的长度。


5. 示例程序

#include <Windows.h>
#include <iostream>
#include <iomanip>

int main()
{
    char szValueName[MAXBYTE] = { 0 };
    char szValueKey[MAXBYTE] = { 0 };
    DWORD dwBufferSize = MAXBYTE;
    DWORD dwKeySize = MAXBYTE;
    DWORD dwType = 0;

    HKEY hKey = NULL;
    char subKeyName[] = "Software\\Microsoft\\Windows\\CurrentVersion\\";
    LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKeyName, 0, KEY_ALL_ACCESS, &hKey);
    if (lRet != ERROR_SUCCESS)
    {
        std::cout << "ERROR:打开注册表失败,可能是因为没有提供管理员权限。";
        return -1;
    }

    int i = 0;
    while (TRUE)
    {
        lRet = RegEnumValue(hKey, i, szValueName, &dwBufferSize, NULL, &dwType, reinterpret_cast<LPBYTE>(szValueKey), &dwKeySize);
        if (lRet == ERROR_NO_MORE_ITEMS)
        {
            break;
        }

        std::cout << i << " " << std::setw(30) <<szValueName << " " << std::setw(50) << szValueKey << std::endl;

        ZeroMemory(szValueKey, MAXBYTE);
        ZeroMemory(szValueName, MAXBYTE);

        dwBufferSize = MAXBYTE;
        dwKeySize = MAXBYTE;

        i++;
    }

    RegCloseKey(hKey);

    return 0;
}
Output:
0                 CommonFilesDir                C:\Program Files (x86)\Common Files
1           CommonFilesDir (x86)                C:\Program Files (x86)\Common Files
2                 CommonW6432Dir                      C:\Program Files\Common Files
3                     DevicePath                                   %SystemRoot%\inf
4            MediaPathUnexpanded                                 %SystemRoot%\Media
5                ProgramFilesDir                             C:\Program Files (x86)
6          ProgramFilesDir (x86)                             C:\Program Files (x86)
7               ProgramFilesPath                                     %ProgramFiles%
8                ProgramW6432Dir                                   C:\Program Files
9       SM_ConfigureProgramsName                    Set Program Access and Defaults
10                   SM_GamesName                                              Games

转载于:https://www.cnblogs.com/coolcpp/p/regoperator.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows10系统注册表Windows10系统中非常重要的一个组成部分,它记录了操作系统的所有设置和配置信息。下面是有关Windows10系统注册表的基本介绍: 1. 注册表的概念:Windows10系统注册表Windows系统中的一种数据库,它是一个层次结构的树形结构,包含了Windows系统的所有设置和配置信息,包括用户设置、系统设置、应用程序设置等。 2. 注册表的位置:Windows10系统注册表的位置在C:\Windows\System32\config下面,其中包含了五个主要的注册表文件:SYSTEM、SOFTWARE、SECURITY、SAM和DEFAULT。 3. 注册表的结构:Windows10系统注册表的结构是一个树形结构,包括了多个分支和叶节点,每个节点都用一个特定的键值来表示,其中包括HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS和HKEY_CURRENT_CONFIG等。 4. 注册表的用途:Windows10系统注册表Windows系统的重要组成部分,它记录了Windows系统的所有设置和配置信息,包括Windows系统的应用程序、服务、文件类型、驱动程序等,它可以帮助用户进行系统设置和配置,也可以用于系统故障排除和修复。 需要注意的是,如果用户不熟悉Windows10系统注册表的操作,建议不要随意修改注册表中的内容,否则可能会导致系统出现错误或不稳定的情况。如果需要修改注册表,请先备份现有的注册表,以便在出现问题时可以快速恢复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值