基于CRegKey类操作注册表
在Visual C++中,为了简化对注册表的操作,MFC提供了一个CRegKey类,该类封装了对注册表的相关操作。使用该类,用户可以非常方便地对注册表进行操作。CRegKey类的主要方法如下:
(1)Create
该方法用于创建所标识的键。
语法:
LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL );
参数说明:
hKeyParent:表示打开的父键句柄。
lpszKeyName:表示键名称。
lpszClass:表示键的类型。
dwOptions:表示键的打开方式。为REG_OPTION_BACKUP_RESTORE,表示以备份或还原的方式打开键。为REG_OPTION_NON_VOLATILE,表示键信息在系统重启后保存到文件中,这是默认的设置,为REG_OPTION_VOLATILE,表示键信息保存在内存中,当系统关闭后,这些信息将不被保存。
samDesired:表示访问权限。
lpSecAttr:表示键句柄的安全属性。
lpdwDisposition:用于返回函数执行的动作。如果为REG_CREATED_NEW_KEY,表示键不存在,函数将创建键信息。为REG_OPENED_EXISTING_KEY,表示键已存在,函数只是打开键。
(2)Open
该方法用于打开注册表键值。
语法:
LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );
参数说明:
hKeyParent:表示打开的父键句柄。
lpszKeyName:表示将要打开的键名称。
samDesired:表示键的访问权限。
(3)SetValue
该方法用于设置指定键下的项信息。
语法:
LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );
LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );
参数说明:
dwValue:表示设置的整数值。
lpszValueName:表示设置的项名称。
lpszValue:表示设置的字符串数据。
hKeyParent:表示父键句柄。
lpszKeyName:表示键名称。
lpszValue:表示设置的项数据。
lpszValueName:表示项名称。
(4)QueryValue
该方法用于获取指定键下的数据。
语法:
LONG QueryValue(LPCTSTR pszValueName,DWORD* pdwType, void* pData,ULONG* pnBytes);
ATL_DEPRECATED LONG QueryValue(DWORD& dwValue,LPCTSTR lpszValueName );
ATL_DEPRECATED LONG QueryValue(LPTSTR szValue,LPCTSTR lpszValueName,DWORD* pdwCount );
参数说明:
pszValueName:表示查询的项名称。
pdwType:整型指针,用于返回项的数据类型。
pData:表示数据缓冲区,用于存储函数返回的数据。
pnBytes:表示数据缓冲区pData的大小,在函数返回后,该参数表示实际返回的数据大小。
dwValue:用于存储函数返回的整型数据。
lpszValueName:表示查询的项名称
szValue:表示数据缓冲区,用于存储函数返回的字符串数据。
pdwCount:表示字符串数据的大小。
下面以一个示例来介绍如何应用CRegKey类对注册表进行操作。
例如,应用CRegKey类对注册表进行操作
(1)创建一个基于对话框的工程,工程名称为“RWReg”,设计对话框资源如图1所示。
.jpg)
图1 对话框设计窗口
(2)在对话框的源文件中引用“atlbase.h”头文件,目的是使用CRegKey类。
#include "atlbase.h" //引用atlbase.h头文件
注意:CRegKey类被声明在atlbase.h头文件中,默认情况下,MFC工程没有引用该头文件。因此为了应用CRegKey类,需要在工程中引用atlbase.h头文件。
(3)处理“写入”按钮的单击事件,将编辑框中的文本写入注册表中。
void CRWRegDlg::OnOK()
{
CRegKey reg; //定义一个CRegKey对象
CString key; //定义一个字符串变量
m_KeyName.GetWindowText(key); //回去编辑框文本
reg.Create(HKEY_CURRENT_USER,key); //创建注册表键值
CString item; //定义字符串变量
m_ItemName.GetWindowText(item); //获取项名
CString value; //定义字符串变量
m_ItemValue.GetWindowText(value); //获取项值
reg.SetValue(value,item); //向注册表中写入数据
reg.Close(); //关闭注册表键句柄
}
(4)处理“读取”按钮的单击事件,从注册表中读取数据。
void CRWRegDlg::OnLoad()
{
CRegKey reg; //定义一个CRegKey对象
CString key; //定义字符串变量
m_KeyName.GetWindowText(key); //获取键名
reg.Open(HKEY_CURRENT_USER,key); //打开注册表键值
CString item; //定义字符串变量
m_ItemName.GetWindowText(item); //获取项名
CString value; //定义字符串变量
DWORD size = MAX_PATH; //定义整型变量
reg.QueryValue(value.GetBuffer(0),item,&size);//从注册表中读取数据
MessageBox(value,"提示"); //以对话框形式弹出读取的数据
}
(5)运行程序,效果如图2所示。
.jpg)
图2 使用CRegKey操作注册表