参考
什么是注册表
注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。
注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息,它包括了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。利用一个功能强大的注册表数据库来统一集中地管理系统硬件设施、软件配置等信息,从而方便了管理,增强了系统的稳定性。
如何打开注册表
win+R 输入regedit
注册表的层次结构
根键:一共5个根键
子键:一个根键下可有多个子键,一个子键下也可有多个子键
数据组成
值名称
不包括反斜线的字符、数字、代表符和空格的任意组合。同一键中不可有相同的名称
值类型
包括字符串、二进制和双字节等
值
值项的具体值,它的大小可以占用64KB
打开子键、新建子键、删除子键
#include <windows.h>
#include <stdio.h>
#include <SHLWAPI.H>
int main() {
// 打开注册表,实质是打开注册表的某一子键并返回其句柄
// 用于接收打开的子键句柄
HKEY hKey = NULL;
// 要打开的子键名
LPCTSTR lpszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion";
// 参数:父键句柄、子键名、0、存取权限、用于接收子键句柄的HKEY变量
// 返回值是状态码
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS){
printf("open success\n");
}
else{
printf("failed to open\n%d", lRet);
}
// 创建新键
// 新键名
LPCTSTR newKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run222";
// 用于接收新键的句柄
HKEY hNewKey = NULL;
// 参数:根键名或父键的句柄、新子键名、0、子键类名、创建选项、存取权限、存句柄安全属性的结构体、接收新子键的句柄、NULL
// 返回值:状态码
LONG createStatus = RegCreateKeyEx(HKEY_LOCAL_MACHINE, newKeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hNewKey, NULL);
if (createStatus == ERROR_SUCCESS){
printf("create or open success\n");
}
else{
printf("failed to create\n");
}
// 删除键值项
RegCloseKey(hNewKey);
int input = 0;
printf("input 1 to delete the key\n");
scanf("%d", &input);
if (input == 1){
LPSTR deleteKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run222";
// 参数:根键名或父键句柄、要删除的子键名
LONG deleteStatus = RegDeleteKeyA(HKEY_LOCAL_MACHINE, deleteKeyName);
if (deleteStatus == ERROR_SUCCESS){
printf("delete success\n");
}
else {
printf("failed to delete\n%d", deleteStatus);
}
}
// 使用完,关闭句柄
RegCloseKey(hKey);
return 0;
}
留坑
win10 64位的系统,C++调用windows的api无法删除注册表的键值项(无子键)
用了RegDeleteKey、RegDeleteKeyEx、SHDeleteKey都是一样的问题,返回码是删除成功,但是查看注册表编辑器,键值项还在(regedit已经刷新了)编译器是dev-cpp带的MinGW-w64