注册表的结构

注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(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

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

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

示例:开机自启注册表

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();
return 0;
}

#### 删除注册表键值

#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();
return 0;
}

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

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

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

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

windowsAPI函数操作注册表实现软件开机自启的更多相关文章

  1. WinForm通过操作注册表实现限制软件使用次数的方法

    1.创建注册表文件: 打开记事本,输入一些内容: ? 1 2 3 REGEDIT4 [HKEY_CURRENT_USER/Software/MyRegDataApp] "UseTime&qu ...

  2. 批处理+VBS+注册表实现开机自动启动EXE程序

    批处理+VBS+注册表实现WINDOWS开机自动启动EXE程序 以下都是基于WINDOWS系统. 我们都知道当我们有想某个程序在开机时自动运行,只能有三个方式: 1.做成服务,然后对服务进行配置为自动 ...

  3. teeChart 修改注册表实现无试用到期提示

    teechart在注册表的跟目录为HKEY_CLASSES_ROOT\CLSID,以下的子目录会根据版本的不同发生改变,但是最底级的目录是TypeLib(例如[HKEY_CLASSES_ROOT\CL ...

  4. C# Winform打包部署时添加注册表信息实现开机启动

    使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下: 1.添加安装部署项目后,鼠标右键安装项目->视图->注册表,HK ...

  5. 【转】C# Winform打包部署时添加注册表信息实现开机启动

    使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下: 1.添加安装部署项目后,鼠标右键安装项目->视图->注册表,HK ...

  6. C# Winform打包部署时添加注册表信息实现开机自启动

    1.原理:需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下 2. 写入注册表的方式有两种 a.在生成安装程序时配置 b.在程序运行时,动态配置 方法一:使用VS2010自带的打包 ...

  7. C# WPF打包部署时添加注册表信息实现开机启动

    使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下: 创建安装部署这部分就不用说了,添加安装部署项目后,鼠标右键安装项目-> ...

  8. C# Winform打包部署时添加注册表信息实现开机启动(转载)

    使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下:    1.添加安装部署项目后,鼠标右键安装项目->视图->注册表 ...

  9. 注册表 API 以及开机自启动

    注册表是window系统中非常重要的一部分,今天在网上查了一些文章学习了下,觉得其中有一句话总结的很经典:注册表是用来存储信息的. 这句话虽然有点废,但是说的没错.当然,注册表中包含的内容非常多,远没 ...

随机推荐

  1. model的基础操作

    1.创建表 1.1 Meta源信息 from django.db import models class UserInfo(models.Model): username = models.CharF ...

  2. 超实用的14个 Spring MVC “隐藏”技巧,用了都说好!

    通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet ...

  3. Typora设置Vue主题

    平时看视频,发现好多老师使用 Typora 时,界面跟我的不一样,好看一些,后来查了下才知道老师使用了Vue主题,接下来我就记录下设置Vue主题的步骤吧 一.下载Vue主题 地址:http://the ...

  4. MATLAB-simulink实现逻辑组合电路--全加器

    author: ZKe 全加器的原理这里就不讲了,不知道的还是去看看数字逻辑课本吧,这里主要记录一下simulink实现逻辑组合电路的方法 首先我们需要知道它的电路图,如下(借用慕课赵贻竹老师的PPT ...

  5. 编码风格:Mvc模式下SSM环境,代码分层管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.分层策略 MVC模式与代码分层策略,MVC全名是ModelViewController即模型-视图-控制器,作为一种软件设计典范,用一种业 ...

  6. php邮箱发送

    php发送邮件 -------------------------------------------------------------------------------- <?php he ...

  7. quic 2 ietf-transport-draft-ietf-quic-transport-09

    quic的优点 Low-latency connection establishment Multiplexing without head-of-line blocking Authenticate ...

  8. 在spark上构造随机森林模型过程的一点理解

    这篇文章仅仅是为了帮助自己理解在分布式环境下是如何进行随机森林模型构建的,文章中记录的内容可能不太准确,仅仅是大致上的一个理解. 1.特征切分点统计 不管是连续取值型特征还是离散取值型特征,分裂树结点 ...

  9. linux服务器间配置ssh免密连接

    先说一下,我用的centos7,root用户.ssh的原理就不说了,网上介绍的文章很多,直接开始说操作步骤吧: 1.首先确认有没有安装ssh,输入 rpm -qa |grep ssh查看 这样就表示安 ...

  10. 查询OSD运行在哪些cpu上

    前言 在看CPU相关的文章的时候,想起来之前有文章讨论是否要做CPU绑定,这个有说绑定的也有说不绑定的,然后就想到一个问题,有去观测这些OSD到底运行在哪些CPU上面么,有问题就好解决了,现在就是要查 ...