注册表是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%. |
函数原型:
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_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY
KEY_SET_VALUE 准许设置子键的数值
(常用)KEY_WRITE 是下面数值的组合:
KEY_SET_VALUE、KEY_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函数来获取一个对错误的总体描述。
LONG RegCloseKey(
HKEY hKey, // handle to key
);
参数说明:
hKey: (同上)
示例:
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函数关闭这个句柄。
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: 键值长度
函数原型:
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_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL。
返回值 (同上)
函数原型:
LONG RegDeleteKey(
HKEY hKey,
LPCTSTR lpSubKEY
);
参数说明:
hKey 同RegCreateKeyEx函数中的hKey参数。
lpSubKey 同RegCreateKeyEx函数中的lpSubKey参数。
返回值 (同上)
直接上代码:
//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条目)。