VS2017 C++ 编写一个通过注册表自定义软件开机启动程序

主要利用三个函数实现,分别是RegOpenKeyEx()、RegSetValueEx()和RegCloseKey()

RegOpenKeyEx函数可以打开一个指定的键,函数原型如下:

LONG RegOpenKeyEx(
  HKEY hkey,
  LPCTSTR lpSubKey,
  DWORD ulOption,
  REGSAM samDesired,
  PHKEY phkResult
);

各参数及返回值的含义如下:

  1.参数hKey为主键值,可以取下面的一些数值:
  HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG
  HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE
  HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系统)
  HKEY_DYN_DATA(WIN9X操作系统)
  2.参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线"\\"分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄。
  3.参数ulOption保留,通常必须设置为0。
  4.参数samDesired的含义用来设置对键访问的权限,可以取下面的一些数值:
  KEY_CREATE_LINK 准许生成符号键
  KEY_CREATE_SUB_KEY 准许生成子键
  KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键
  KEY_EXECUTE 准许进行读操作
  KEY_NOTIFY 准许更换通告
  KEY_QUERY_VALUE 准许查询子键
  KEY_ALL_ACCESS 提供完全访问,是上面数值的组合
  KEY_READ 是下面数值的组合:
  KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY
  KEY_SET_VALUE 准许设置子键的数值
  KEY_WRITE 是下面数值的组合:
  KEY_SET_VALUE、KEY_CREATE_SUB_KEY
  5.参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄。

  6.返回值,如果函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage函数来获取一个对错误的总体描述。

 RegSetValueEx函数可以设置注册表中键的值,函数原型如下:
  LONG RegSetValueEx(
  HKEY hKey,
  LPCTSTR lpValueName,
  DWORD Reserved,
  DWORD dwType,
  CONST BYTE *lpData,
  DWORD cbData
  );
  各个参数及返回值的含义如下:
  1.参数hKey的含义同RegOpenKeyEx函数中的hKey参数。
  2.参数lpValueName为一个指向包含值名的字符串指针。
  3.Reserved保留,通常必须设置为0。
  4.参数dwType确定了设置的值的类型,数据类型为下列类型之一:
  REG_BINARY 二进制数据
  REG_DWORD 32位整数
  REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存
  REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存
  REG_EXPAND_SZ 一个包含未扩展环境变量的字符串
  REG_LINK 一个Unicode类型的链接
  REG_MULIT_SZ 以两个零结尾的字符串
  REG_NONE 无类型数值
  REG_RESOURCE_LIST 设备驱动资源列表
  REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串
  5.参数lpData为一个指向包含数据的缓冲区的指针。
  6.参数cbData以字节为单位,指定数据的长度。

  7.返回值同RegOpenKeyEx函数的返回值。

RegCloseKey释放指定注册键的句柄
LONG RegCloseKey(
HKEY hKey // 释放键的句柄

);

    1.hKey:想要关闭的已经打开的键。

    2.返回值同RegOpenKeyEx函数的返回值。

程序源码:

#include 
#include 
#include  // 使用 _T宏

using namespace std;

int test()
{
	//_T宏可以把一个引号引起来的字符串,根你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
	LPCTSTR lpSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
	HKEY hKey;
	REGSAM flag = KEY_WOW64_64KEY;//当前系统为win7 64位,访问的是64位的注册表,如果访问32位,则改为KEY_WOW64_32KEY
	LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_ALL_ACCESS|flag,&hKey);

	if (ERROR_SUCCESS != lRet)
	{
		cout << "RegOpenKeyEx fail!" << endl;
		return 0;
	}

	LPCTSTR pchrName = _T("D:\\Program Files (x86)\\test.exe");
	lRet = RegSetValueEx(hKey, TEXT("TEST"), 0, REG_SZ, (LPBYTE)pchrName, wcslen(pchrName) * sizeof(TCHAR) + 1);

	if (ERROR_SUCCESS != lRet)
	{
		cout << "RegSetValueEx fail!" << endl;
		return 0;
	}
	RegCloseKey(hKey);

	return 0;
}

int main()
{
    test();
    system("pause");
    return 0;
}

运行完毕后,打开注册表查看:

VS2017 C++ 编写一个通过注册表自定义软件开机启动程序_第1张图片

VS2017 C++ 编写一个通过注册表自定义软件开机启动程序_第2张图片

你可能感兴趣的:(控制台程序,VS2017,C++)