玩转注册表,这几个windowsAPI函数就够了

news2024/9/21 5:30:43

注册表的结构

注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(Key),它类似磁盘中的目录,注册表还包含键值(Value),它类似磁盘中的文件一个键可以包含多个子健和键值,其中键值用于存储数据,顶层建称为根键,注册表的根键如下图(Win+R 输入命令 regedit ):

根键

下面介绍几个windowsAPI函数来操作注册表,并实现软件开机自启。C/C++代码,只要能包含头文件windows.h都可以调用此API函数实现开机自启.

RegCreateKeyEx函数

创建指定的注册表项。如果键已经存在,函数将打开它。

LONG RegCreateKeyEx(
  HKEY hKey,                                  // handle to open key
  LPCTSTR lpSubKey,                           // subkey name
  DWORD Reserved,                             // reserved
  LPTSTR lpClass,                             // class string
  DWORD dwOptions,                            // special options
  REGSAM samDesired,                          // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
  PHKEY phkResult,                            // key handle
  LPDWORD lpdwDisposition                     // disposition value buffer
);

参数

  • hkey

当前打开的密钥或以下预定义密钥之一的句柄:

根键

HKEY_CLASSES_ROOT 存储文件关联和COM对象注册信息

HKEY_CURRENT_CONFIG 存储硬件配置信息

HKEY_CURRENT_USER 存储与当前登录账户相关的信息

HKEY_LOCAL_MACHINE 存储系统相关的信息

HKEY_USERS 存储所有账户信息

win+R,输入regedit命令打开注册表

根键

  • lpSubKey

指向空终止字符串的指针,该字符串指定此函数打开或创建的子键的名称。

上图中的路径,文件夹路径子健

健key

示例:开机自启注册表

char *szSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";

RegCreateKeyEx函数打开或创建的键是由hKey参数标识的键的子键

返回值

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

如果函数失败,返回值是Winerror.h中定义的非零错误代码。可以使用FormatMessage函数和FORMAT_MESSAGE_FROM_SYSTEM标志来获得错误的通用描述。

RegSetValueEx函数

在注册表项下设置指定值的数据和类型。

LONG RegSetValueEx(
  HKEY hKey,           // 键值所在子健的子健句柄
  LPCTSTR lpValueName, // 要设置的键值名称
  DWORD Reserved,      // 为0
  DWORD dwType,        // 要设置的键值的数据类型
  CONST BYTE *lpData,  // 键值数据缓冲区
  DWORD cbData         // 缓冲区长度
);

参数

  • hKey

RegCreateKeyEx设置的hkey

  • lpValueName

名称

  • lpData

开机自启程序名称(包含路径)

GetModuleFileName

获取执行文件的文件名(包含路径)

char szModule[MAX_PATH];
GetModuleFileName(NULL, szModule, MAX_PATH);

RegDeleteValue函数

在注册表项下删除指定值的数据和类型

LONG RegDeleteValueW (
	HKEY hKey,				//键值所在子健的子健句柄
	LPCWSTR lpValueName		//要删除的键值名称
);

RegQueryValueEx函数

查询所打开注册表键所关联的一个给定值的类型和数据

LONG RegQueryValueEx(  HKEY hKey,           // 要查询键的句柄
	LPTSTR lpValueName,  // 要查询值的名字的地址
	LPDWORD lpReserved,  // 保留
	LPDWORD lpType,      // 值类型缓存地址
	LPBYTE lpData,       // 数据缓存地址
	LPDWORD lpcbData     // 数据缓存大小地址
);

注册表API应用实例(开机自启)

设置、取消、查询开机自启

VC6.0,VS(设置多字节字符集)可直接运行成功

设置,查询注册表键值

#include <stdio.h>
#include <windows.h>
int main()
{
	// 根键、子键名称、和到子键的句柄
	HKEY hRoot = HKEY_CURRENT_USER;	
	char *szSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hKey;

	// 打开指定子键
	DWORD dwDisposition = REG_OPENED_EXISTING_KEY;	// 如果不存在不创建
	LONG lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
	if (lRet != ERROR_SUCCESS)
		return-1;

	// 得到当前执行文件的文件名(包含路径)
	char szModule[MAX_PATH];
	GetModuleFileName(NULL, szModule, MAX_PATH);
	printf("要设置的键值数据为:%s\n", szModule);
	// 创建一个新的键值,设置键值数据为文件名 SelfRunDemo为名称,相同会覆盖
	lRet = RegSetValueEx(hKey, "SelfRun", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
	if (lRet == ERROR_SUCCESS)
	{
		printf("自动启动设置成功!\n");
	}
	//查询键值
	DWORD len;
	memset(szModule,'\0', sizeof(szModule));
	lRet = RegQueryValueEx(hKey, "SelfRun", 0, NULL, (BYTE*)szModule, &len);
	printf("要查询的键值数据为:%s\n", szModule);

	// 关闭子键句柄
	RegCloseKey(hKey);
	getchar();
	return0;
}

删除注册表键值

#include <stdio.h>
#include <windows.h>
int main()
{
	// 根键、子键名称、和到子键的句柄
	HKEY hRoot = HKEY_CURRENT_USER;	
	char *szSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hKey;

	// 打开指定子键
	DWORD dwDisposition = REG_OPENED_EXISTING_KEY;	// 如果不存在不创建
	LONG lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
		REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
	if (lRet != ERROR_SUCCESS)
		return-1;

	// 得到当前执行文件的文件名(包含路径)
	char szModule[MAX_PATH];
	GetModuleFileName(NULL, szModule, MAX_PATH);
	printf("要设置的键值数据为:%s\n", szModule);
	// 创建一个新的键值,设置键值数据为文件名 SelfRunDemo为名称,相同会覆盖
	lRet = RegSetValueEx(hKey, "SelfRun", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
	if (lRet == ERROR_SUCCESS)
	{
		printf("自动启动设置成功!\n");
	}
	//删除键值
	lRet = RegDeleteValue(hKey, "SelfRun");
	if (lRet == ERROR_SUCCESS)
	{
		printf("删除成功!\n");
	}
	// 关闭子键句柄
	RegCloseKey(hKey);
	getchar();
	return0;
}

如何查看是否设置开机自启了呢,win+R,输入命令regedit,找到路径:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

SelfRun程序开机自启

可以看到SelfRun已经添加到注册表了

当然,你也可以重启一下电脑

最后,这几个AIP是可以在任何包含「windows.h」头文件的程序上运行的,完全可以操作注册表,但是这「不是唯一」可以操作注册表的方式,不同的框架封装了不同的可去实现注册表的操作,例如「MFC」「CRegKey」类,「Qt」「QSetting」类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陌陌聊天数据分析 (一)

陌陌聊天数据分析&#xff08;一&#xff09; 目标 基于Hadoop和Hive实现聊天数据统计分析&#xff0c;构建聊天数据分析报表 需求 统计今日总消息量统计今日每小时消息量&#xff0c;发送和接收用户数量统计今日各地区发送消息数据量统计今日发送消息和接收消息用户数统计…

vue移动端手把手教你封装一个可移动悬浮窗、可移动打开扇形悬浮按钮组件

目录 概要 功能设计 技术细节-API回顾 touchstart 事件 touchmove事件 完整的代码实现&#xff08;悬浮窗&#xff09; 运行效果 进阶封装——可移动扇形展开悬浮按钮 实现效果演示 需求分析 代码实现 概要 悬浮窗、悬浮按钮是项目中常见的一种交互设计&#xff0c;特别是在移…

Linux国产操作系统,UCA-系统工程师学习必备技能,文件管理和查找、内容查找、归档的再学习

复习和巩固Linux的基础操作&#xff0c;对文件管理和查找、内容查找、归档以及管道和输入输出重定向进行再学习。 目录 1.文件管理 1. 1.head命令 1.2. tail命令 1.3. more/less命令 1.4. wc 统计命令 1.5. sort 排序命令 1.6. uniq 去重命令 1.7. paste合并命令 2.文…

基于matlab对现代相控阵系统中常用的子阵列进行建模分析(附源码)

一、前言 本示例说明如何使用相控阵系统工具箱对现代相控阵系统中常用的子阵列进行建模并进行分析。 相控阵天线与传统碟形天线相比具有许多优势。相控阵天线的元件更容易制造;整个系统受组件故障的影响较小;最重要的是&#xff0c;可以向不同方向进行电子扫描。 但是&#xff…

耗时半个月,终于把十几个大厂的python面试题整理成了PDF合集(基础+高级+web+数据库+爬虫)

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;近期的面试越来越难了&#xff0c;要背的越来越多了&#xff0c;考察得越来越细&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些程序员了。 这不&#xff0c;为了帮大家节约时间&#…

JVM垃圾回收与双亲委派模型

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 前端使用VSCode(Visual Studio Code1.78.2) 电脑使用的操作系统版本为 Windows 10 目录 1. 什么是 JVM 2. jvm 发展史 2.1 Sun Classic VM 2.2 Exact VM 2.3 HotSpot VM 2.4 JRockit …

Docker部署——将jar包打成docker镜像并启动容器

在代码编写完成即将部署的时候&#xff0c;如果采用docker容器的方法&#xff0c;需要将jar包打成docker镜像并通过镜像将容器启动起来。具体的步骤如下。 一、首先下载java镜像 先使用docker search java命令进行搜索。 然而在拉取镜像的时候要注意不能直接去选择pull java ,…

在线DDL操作踩坑记录

官方地址&#xff1a;GitHub - github/gh-ost: GitHubs Online Schema-migration Tool for MySQL 使用ghost方式在线对mysql表进行ddl ghost原理&#xff1a; 要对表A进行DDL&#xff0c;在主库建立一个ghost表 A1在表A1上进行alter操作伪装成一个mysql的从库&#xff0c;监…

Java集合框架:队列、Queue和Deque详解

目录 一、普通队列 1. 概念 2. Queue&#xff08;Java集合框架的接口&#xff09; 3. Queue中的方法 4. 方法使用演示 5. 队列的模拟实现 6. 顺序普通队列的缺点&#xff1a; 二、循环队列 1. 循环队列也是一种数据结构。基于上述队列的缺点&#xff0c;此时就有了循环…

为什么我不建议你入行网络安全,因为99.9%的人都绕不过这三个坎

前言 我一个朋友老赵&#xff0c;老赵在一家大型互联网公司做高级网络安全工程师&#xff0c;从实习生到工程师整整呆了六年。去年他们公司为了缩减成本&#xff0c;做了裁员&#xff0c;他也在其中&#xff0c;取而代之的是一个只有三年工作经验的 “新人” … 老赵想着&…

Windows10下安装Oracle19c提示“无法将 **\** 安装用户添加到 ** 组“解决办法

问题描述 操作系统&#xff1a;window10 数据库版本&#xff1a;Oracle19c 本机在安装Oracle19c提示无法将 ZHOUQUAN\zhouquan 安装用户添加到 %2% 组。 问题原因 根据安装的对话框中的日志&#xff0c;找到并打开 日志报错信息&#xff1a; 信息: WindowsSecurityExcep…

时序预测 | Matlab实现INFO-ELM向量加权算法优化极限学习机时间序列预测

时序预测 | Matlab实现INFO-ELM向量加权算法优化极限学习机时间序列预测 目录 时序预测 | Matlab实现INFO-ELM向量加权算法优化极限学习机时间序列预测效果一览基本介绍程序设计学习总结参考资料 效果一览 基本介绍 Matlab实现INFO-ELM向量加权算法优化极限学习机时间序列预测 …

skywalking 源码

源码核心是SkyWalkingAgent 找到一堆插件&#xff0c;来对符合条件的类来代理 通过AbstractClassEnhancePluginDefine.define方法来。 如果有很多版本的插件&#xff0c;spring有2.0版本,3.0版本,4.0版。 具体使用哪个版本&#xff0c;看被增加的类使用的是哪个版本的spring …

vue基础--计算商品的总价格

计算商品的总价格&#xff1a; 1、在 父组件中 通过计算属性 动态把总价格计算出来&#xff0c; 2、通过 父向子传值&#xff0c;通过自定义属性&#xff0c;把值传给 子组件 父组件&#xff1a; 1、使用计算属性computed 计算总价格&#xff1a; 1.1、先用filter 过滤出 数…

Unity UGUI5——图集

一、Drawcall ​ 字面理解 DrawCall&#xff0c;就是绘制呼叫的意思&#xff0c;表示 CPU&#xff08;中央处理器&#xff09;通知 GPU&#xff08;图形处理器-显卡&#xff09; &#xff08;一&#xff09;DrawCall 概念 就是 CPU &#xff08;处理器&#xff09;准备好渲染…

基于Web的停车场管理系统(Java)

目录 一、系统介绍 1.开发的环境 2.本系统实现的功能 3.数据库用到的表 4.工程截图 二、系统展示 1、登录页面 2、首页 3、系统信息管理模块 4、车位信息管理模块 5、IC卡信息管理模块 ​编辑6、固定车主停车管理模块 7、临时车主停车管理模块 8、系统功能操作模块 …

unity3d:小地图UV,UGUIshader毒圈挖孔,缩圈

运行效果 场景中缩圈 小地图中挖孔 大地图中挖孔 小地图 方案1使用Mask 给了一个方形的mask组件&#xff0c;然后根据玩家位置计算出地图左下角的位置进行移动。这种实现方式虽然简单&#xff0c;但是会有两个问题&#xff1a; 1.Overdraw特别大&#xff0c;几乎很多时候会有…

【LLMs 入门实战 】Vicuna 模型学习与实战

UC伯克利学者联手CMU、斯坦福等&#xff0c;再次推出一个全新模型70亿/130亿参数的Vicuna&#xff0c;俗称「小羊驼」&#xff0c;小羊驼号称能达到GPT-4的90%性能。 欢迎使用小羊驼&#x1f999;环境搭建权重下载下载 Vicuna Weight下载 LLAMA Weight构建真正的 working weigh…

Lattice Planner从入门到放弃

Lattice Planner相关背景和更正式的公式推导可以直接参考其原始论文《Optimal Trajectory Generation for Dynamic Street Scenarios in a Frent Frame》&#xff08;ICRA 2010&#xff09;&#xff0c;本文侧重于Lattic planner理论和代码的结合。 1. Lattice Planner基本流程…

2023年6月GESP能力等级认证C++一级真题

2023-06 GESP一级真题 题数&#xff1a;27 分数&#xff1a;100 测试时长&#xff1a;60min 一、选择题(每题 2 分&#xff0c;共 30 分) 1.以下不属于计算机输入设备的有 (B ) 。&#xff08;2分&#xff09; A、键盘 B、音箱 C、鼠标 D、传感器 答案解析&#xff1…