注册表概述
概述
注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等.
数据结构
注册表由键(或称"项")、子键(子项)和值项构成.一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键.一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成.一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值.
数据类型
注册表的数据类型主要有以下四种:
显示类型(在编辑器中) 数据类型 说明
REG_SZ 字符串 文本字符串
REG_MULTI_SZ 多字符串 含有多个文本值的字符串
REG_BINARY 二进制数 二进制值,以十六进制显示.
REG_DWORD 双字 一个32位的二进制值,显示为8位的十六进制值.
各主键的简单介绍
- HKEY_LOCAL_MACHINE 是一个显示控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括网络和硬件上所有的软件设置.
- HKEY_CLASSES_ROOT 是系统中控制所有数据文件的项.
- HKEY_USERS 将缺省用户和目前登陆用户的信息输入到注册表编辑器
- HKEY_CURRENT_USER 包含着在HKEY_USERS安全辨别里列出的同样信息
- HKEY_CURRENT_CONFIG 包括了系统中现有的所有配置文件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.
相关函数
显示相关函数
[创建键][打开键][删除键][添加/修改键值][删除键值][读取键值]
创建键 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,dwOptions,samDesired: 置0
lpClass,lpSecurityAttributes: 置NULL
phkResult: 用于接收键句柄
lpdwDisposition: 接收的相关信息,取值如下
REG_CREATED_NEW_KEY 创建成功
REG_OPENED_EXISTING_KEY 键已存在
打开键 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: 要打开键的句柄或以下预定义句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpSubKey: 指向一个用于定义子键路径的字符串
ulOptions: 保留位,置0
samDesired: 打开键后键的操作权限
phResult: 接收打开的键的句柄
删除键 RegDeleteKey
函数原型
LONG RegDeleteKey(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey // subkey name
);
参数说明
hKey: 要打开键的句柄或以下预定义句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpSubKey: 指向一个用于定义子键路径的字符串
修改/添加键值 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: 打开键的句柄或以下预定义句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpValueName: 键值的名称
Reserved: 保留位,置0
dwType: 键值的类型
lpData: 键值
cbData: 键值数据长度
删除键值 RegDeleteValue
函数原型
LONG RegDeleteValue(
HKEY hKey, // handle to key
LPCTSTR lpValueName // value name
);
参数说明
hKey: 打开键的句柄或以下预定义句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpValueName: 键值的名称
读取键值 RegQueryValueEx
函数原型
LONG RegQueryValueEx(
HKEY hKey, // handle to key
LPCTSTR lpValueName, // value name
LPDWORD lpReserved, // reserved
LPDWORD lpType, // type buffer
LPBYTE lpData, // data buffer
LPDWORD lpcbData // size of data buffer
);
参数说明
hKey: 打开键的句柄或以下预定义句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpValueName: 键值的名称
Reserved: 保留位,置0
lpType: 接收键值的类型
lpData: 接收键值
lpcbData: 接收键值数据长度
注册表编程(利用注册表写开机启动程序)
执行流程
代码样例
运行结果:
删除键
修改/创建键值
运行结果:
读取键值
运行结果(读取"test"键值):
删除键值
运行结果:
#include <windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;
void main()
{
HKEY hKey;
LPCTSTR lpRun = "Software\\_MyTest";
DWORD state,dwtype,sizeBuff;
long lRet;
char reBuff[10] = {0};
/*创建键***************************************************************************/
创建键
//lRet = RegCreateKeyEx(HKEY_CURRENT_USER,lpRun,0,NULL,0,0,NULL,&hKey,&state);
//if(lRet == ERROR_SUCCESS)
//{
// if(state == REG_CREATED_NEW_KEY)
// cout<<"表项创建成功"<<endl;
//
// //关闭键
// RegCloseKey(hKey);
//}
/*打开/修改键值********************************************************************/
打开键
//lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
//if(lRet == ERROR_SUCCESS)
//{
// //创建或者修改键值
// RegSetValueEx(hKey, "test",0,REG_SZ,(BYTE *)"success",10);
//
// //关闭键
// RegCloseKey(hKey);
//}
/*读取键值*************************************************************************/
打开键
//lRet= RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_READ, &hKey);
//if(lRet == ERROR_SUCCESS)
//{
// sizeBuff = sizeof(reBuff);
//
// //读取键值
// if(RegQueryValueEx(hKey,"test",0,&dwtype,(BYTE*)reBuff,&sizeBuff) == ERROR_SUCCESS)
// cout<<reBuff<<endl;
//
// //关闭键
// RegCloseKey(hKey);
//}
/*删除键值************************************************************************/
打开键
//lRet = RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);
//if(lRet==ERROR_SUCCESS)
//{
// //删除键
// RegDeleteValue(hKey,"test");
//
// //关闭键
// RegCloseKey(hKey);
//}
/*删除键**************************************************************************/
RegDeleteKey(HKEY_CURRENT_USER,lpRun);
system("pause");
}
利用注册表写开机启动程序
说明:
通过向注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 中添加键值来让程序在开机时被系统加载.
步骤:
- 设置开机启动
- 取消开机启动
程序源码:
//这里用的是宽字符,既 wchar_t
if(isStartOpen)
{
//开机启动
HKEY hKey;
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//---------------找到系统的启动项
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
//-----------打开启动项Key
if(lRet == ERROR_SUCCESS)
{
wchar_t pFileName[MAX_PATH] = {0};
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//----------------得到程序自身的全路径
lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
//----------------添加或者修改注册表项
RegCloseKey(hKey);
//----------------关闭注册表
}
}
else
{
//取消卡机启动
HKEY hKey;
LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//---------------找到系统的启动项
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet==ERROR_SUCCESS)
{
RegDeleteValue(hKey,L"DeskPro");
//----------------删除注册表项
RegCloseKey(hKey);
//----------------关闭注册表
}
}