windowsAPI函数操作注册表实现软件开机自启
注册表的结构
注册表是一个数据库,它的结构同逻辑磁盘类似。注册表包含键(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」类。