注册表操作C/C++(实战实现程序自启动)

C/C++ 注册表操作

  • 注册表概述
  • 一、注册表数据结构
  • 二、相关函数
    • 1.创建键 RegCreateKeyEx()
    • 2.关闭键RegCloseKey()
    • 3.关闭键RegOpenKeyEx()
    • 4.修改/添加键RegSetValueEx()
    • 5.查询/读取键RegQueryValueEx()
    • 6.删除键RegDeleteValue()
  • 三、实战实现程序自启动
  • 四、总结


注册表概述

注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等.


一、注册表数据结构

基本概念:

根键 作用
HKEY_LOCAL_MACHINE 是一个显示控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括网络和硬件上所有的软件设置.
HKEY_CLASSES_ROOT 是系统中控制所有数据文件的项
HKEY_USERS 将缺省用户和目前登陆用户的信息输入到注册表编辑器
HKEY_CURRENT_USER 包含着在HKEY_USERS安全辨别里列出的同样信息.
HKEY_CURRENT_CONFIG 包括了系统中现有的所有配置文件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.

数据类型:

显示类型 说明
REG_SZ (字符串) 文本字符串
REG_MULTI_SZ (多字符串) 含有多个文本值的字符串
REG_BINARY (二进制数 ) 二进制值,以十六进制显示.
REG_DWORD(双字) 一个32位的二进制值,显示为8位的十六进制值.
REG_LINK (链接) 符号链接.
REG_RESOURCE_LIST(二进制值) 设备驱动程序资源列表.
REG_EXPAND_SZ(可扩充字符串) 扩展字符串,可以加入变量如%PATH%.

查看注册表图如下:
注册表操作C/C++(实战实现程序自启动)_第1张图片

二、相关函数

1.创建键 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
	HKEY_CURRENT_USER
	HKEY_LOCAL_MACHINE
	HKEY_USERS
lpSubKey:   指向一个用于定义子键路径的字符串
Reserved:	  保留,设置为0。
lpClass:	 一个指向包含键类型的字符串。如果该键已经存在,则设置为NULL。
dwOptions:   为新创建的键设置一定的属性,一般设置为0。可以取下面数值:
	REG_OPTION_NON_VOLATILE 新创建的键为一个非短暂性的键
  REG_OPTION_VOLATILE 新创建的键为一个短暂性的键Windows95忽略该数值。
  REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持。
samDesired:  用来设置对键访问的权限,可以取下面的一些数值:
   (常用)KEY_ALL_ACCESS 提供完全访问,是下面数值的组合:
	KEY_CREATE_LINK 准许生成符号键
  KEY_CREATE_SUB_KEY 准许生成子键
  KEY_ENUMERATE_SUB_KEYS 准许生成枚举子键
  KEY_EXECUTE 准许进行读操作
  KEY_NOTIFY 准许更换通告
  KEY_QUERY_VALUE 准许查询子键
 
  (常用)KEY_READ 是下面数值的组合:
  KEY_QUERY_VALUEKEY_ENUMERATE_SUB_KEYSKEY_NOTIFY
  KEY_SET_VALUE 准许设置子键的数值
  
  (常用)KEY_WRITE 是下面数值的组合:
  KEY_SET_VALUEKEY_CREATE_SUB_KEY
lpSecurityAttributes:   一般设置为NULL。为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述。
phkResult:   用于接收键句柄
lpdwDisposition:   接收的相关信息,取值如下
	REG_CREATED_NEW_KEY   创建成功
	REG_OPENED_EXISTING_KEY    键已存在
返回值:如果函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage函数来获取一个对错误的总体描述。
	

2.关闭键RegCloseKey()

LONG RegCloseKey(
  HKEY hKey,            // handle to key
);

参数说明:
hKey:  (同上)

示例:

注册表操作C/C++(实战实现程序自启动)_第2张图片


3.关闭键RegOpenKeyEx()

LONG RegOpenKeyEx(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey,  // subkey name
  DWORD ulOptions,   // reserved
  REGSAM samDesired, // security access mask
  PHKEY phkResult    // handle to open key
);

参数说明:
hKey: (同上)
lpSubKey: (同上)
ulOptions:保留,通常设置为0
samDesired: (同上)
phkResult: 为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄。

4.修改/添加键RegSetValueEx()

LONG RegSetValueEx(
  HKEY hKey,           // handle to key
  LPCTSTR lpValueName, // value name
  DWORD Reserved,      // reserved
  DWORD dwType,        // value type
  CONST BYTE *lpData,  // value data
  DWORD cbData         // size of value data
);

参数说明:
hKey: (同上)
lpValueName: (同上)
Reserved: (同上)
dwType: 确定了设置的值的类型同参数(看上面表格)
*lpData: 为一个指向包含数据的缓冲区的指针即设置键值
cbData: 键值长度

示例:
注册表操作C/C++(实战实现程序自启动)_第3张图片


5.查询/读取键RegQueryValueEx()

函数原型:

LONG RegQueryValueEx(
  HKEY hKey,
  LPTSTR lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE lpData,
  LPDWORD lpcbData
  );
  
参数说明:
hKey (同上)
lpVauleName  为一个指向非空的包含查询值的名称的字符串指针。
lpReserved  保留,必须为NULL。
lpType   为一个指向数据类型的指针,数据类型为下列类型之一:
  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类型的字符串
lpData  为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL。
lpcbData  为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZREG_MULTI_SZREG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL。
返回值 (同上)

示例:
注册表操作C/C++(实战实现程序自启动)_第4张图片

6.删除键RegDeleteValue()

函数原型:

LONG RegDeleteKey(
  HKEY hKey,
  LPCTSTR lpSubKEY
  );
  
参数说明:
hKey  同RegCreateKeyEx函数中的hKey参数。
lpSubKey  同RegCreateKeyEx函数中的lpSubKey参数。
返回值 (同上)

示例:
注册表操作C/C++(实战实现程序自启动)_第5张图片
注册表操作C/C++(实战实现程序自启动)_第6张图片

三、实战实现程序自启动

直接上代码:

//pathName 自启动程序路径
void ComputerStart(char *pathName)
{
	//找到系统的启动项 
	char *szSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	HKEY hKey;

	//打开注册表启动项 
	int k = RegOpenKeyExA(HKEY_CURRENT_USER, szSubKey, 0, KEY_ALL_ACCESS, &hKey);
	cout<<hKey;
	//判断是否注册
	LPCSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
	LPBYTE owner_Get=new BYTE[MAX_PATH];
	DWORD type_1=REG_SZ ; 
	DWORD cbData_1=MAX_PATH;

	int ret1=RegQueryValueEx(hKey, "udp_client", NULL,&type_1, owner_Get, &cbData_1);
	//printf("owner=%s\n",owner_Get);
	if(ret1 == ERROR_SUCCESS)
	{
	//printf("已注册\n");
	RegCloseKey(hKey);
	delete[] owner_Get; 
	return;
	}

	if (k == ERROR_SUCCESS)
	{
		//添加一个子Key,并设置值,MyStart为启动项名称,自定义设置;
		RegSetValueExA(hKey, "udp_client", 0, REG_SZ, (BYTE *)pathName, strlen(pathName));
		//printf("设置成功\n");
	}
	else
	{
		//printf("设置失败\n");
	}

	delete[] owner_Get; 
	RegCloseKey(hKey);
}

四、总结

以上就是关于注册表的常用接口,还有其他接口就不一一列举了大致参数类型都差不多。在程序中使用注册表,不外乎创建、打开、读取、设置、删除这五个常规操作,(要想获得更详细的资料可以参考Visual Studio6.0帮助目录中MSDN Library Visual Studio6.0|Platform SDK|Window Base Services|General Library|Registry条目)。


点个赞再走吧

你可能感兴趣的:(window,编程语言)