Windows:注册表编程

本文详细介绍了Windows注册表的基本概念,包括其作为核心数据库的重要性,如何通过Win+R打开注册表,层次结构的组织方式,以及如何使用C++ API进行子键操作,如打开、创建和删除。特别关注了C++在Windows 10 64位系统中遇到的删除键值项问题及其解决方案。
摘要由CSDN通过智能技术生成

参考

Windows注册表

什么是注册表

注册表是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
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值