mfc三视图和斜等测图实现_开机自启功能实现

本文介绍了使用C/C++及Windows API实现软件开机自动启动的方法。通过RegCreateKeyEx、RegSetValueEx等函数操作注册表,实现软件开机自启功能,并提供设置、删除注册表键值的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4d8526f6cf90785fe9f45f0665caa3c6.png

注册表的结构

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

d5d3a095118d9f02f46697a9b170d26b.png

下面介绍几个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命令打开注册表

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

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

3bef18870ade072912f31207238dbc80.png

示例:开机自启注册表

char *szSubKey = "SoftwareMicrosoftWindowsCurrentVersionRun";

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 = "SoftwareMicrosoftWindowsCurrentVersionRun";
    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("要设置的键值数据为:%sn", 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("要查询的键值数据为:%sn", szModule);

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

删除注册表键值

#include <stdio.h>
#include <windows.h>
int main()
{
    // 根键、子键名称、和到子键的句柄
    HKEY hRoot = HKEY_CURRENT_USER; 
    char *szSubKey = "SoftwareMicrosoftWindowsCurrentVersionRun";
    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("要设置的键值数据为:%sn", 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_USERSoftwareMicrosoftWindowsCurrentVersionRun

2f4c671aba9ddb90ae4359c45aaa923d.png

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值