3.1. CRegKey 类及主要使用和函数说明
所需要头文件:atlbase.h
常用函数
(1) 打开一个键的函数:
1RegOpenKeyEx
函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键
LPCTSTR lpSubKey,//要打开的子键名字的地址
DWORD ulOptions,//保留值,必须为0
REGSAM samDesired,//打开方式,如读还是写
PHKEY phkResult//返回的打开的子键的句柄
);
2RegOpenKey 这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。
LONG RegOpenKey(HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址
);
注意:RegOpenKey这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。
(2)查询某一个键值:RegQueryValueEx
函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄
LPCTSTR lpValueName,//要查询的键值的名称
LPDWORD lpReserved,//保留值
LPDWORD lpType,//要查询的数据的类型
LPBYTE lpData,//要返回的查询的数据
LPDWORD lpcbData//预置的数据的长度
);
(3)设置一个键值RegSetValueEx
函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄
LPCTSTR lpValueName,//要访问的键值的名称
LPDWORD lpReserved,//保留值
DWORD dwType,//要设置的数据的类型
const BYTE *lpData,//要设置的健值
DWORD cbData//数据的长度
);
(4)新建指定键RegCreateKey
函数定义:LONG RegCreateKey (HKEY hkey, // 要打开键的句柄
LPCTSTR lpsubkey, // 要打开子键的名字的地址
PHKEY phkresult // 已打开句柄的缓存区的地址
);
注意:如果这个键在注册表中已经存在,这个函数打开它。
(5)删除
1删除注册表指定键下的值
LONG RegDeleteValue(HKEY hKey, //子键的句柄
LPCTSTR lpValueName //删除键值的名称
);
2删除注册表项 (注册表文件夹)就用
LONG RegDeleteKey(HKEY hKey, //已打开的键的句柄
LPCTSTR lpSubKey //要删除的子键或路径
);
RegDeleteKey 也可用来删除一个键值。在 Win 95/98 平台下,也可用来删除整个子键和键值。但是在Windows NT/2000平台下,只能用来删除没有子键的键。
3删除一个带有很多子键值的键
DWORD SHDeleteKey(HKEY hkey,// 注册表打开的键值的句柄
LPCTSTR pszSubKey //被删除的键值名称
);
当然你得包含头文件shlwapi.h,并且添加shlwapi.lib。
注意:这个函数很危险,如在你的程序中使用SHDeleteKey(hkey,NULL),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run下的所有值;如果使用SHDeleteKey(HKEY_CURRENT_USER,”SOFTWARE//Microsoft//Windows//CurrentVersion//Run”),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run这个键以及下面的所有子键和值。
3.2. 实例
(1)读取注册表
1查看HKEY_CURRENT_USER主键下Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0子键中名称为GridProgressColumnIndex的值,其类型为DWORD。
void OnBnClickedQuery() //响应按钮IDC_QUERY
{
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("/Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0");
//访问注册表,hKEY则保存此函数所打开的键的句柄
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_READ,&hKEY))
{
DWORD dwValue;
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD;
if (::RegQueryValueEx(hKEY,_T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
{
AfxMessageBox(_T("错误:无法查询有关的注册表信息"));
}
//程序结束,关闭打开的hKEY
::RegCloseKey(hKEY);
}
UpdateData(false);
// TODO: 在此添加控件通知处理程序代码
}
可以看到读取的注册表GridProgressColumnIndex的值是正确的。
2查看HKEY_LOCAL_MACHINE主键下SOFTWARE//Microsoft//Windows NT//CurrentVersion子键中名称为"SoftwareType的值,其类型为REG_SZ。
void OnBnClickedQuery()
{
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("SOFTWARE//Microsoft//Windows NT//CurrentVersion");
//访问注册表,hKEY则保存此函数所打开的键的句柄
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY))
{
char dwValue[256];
DWORD dwSzType = REG_SZ;
DWORD dwSize = sizeof(dwValue);
if (::RegQueryValueEx(hKEY,_T("SoftwareType"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
{
AfxMessageBox(_T("错误:无法查询有关的注册表信息"));
}
//程序结束,关闭打开的hKEY
::RegCloseKey(hKEY);
}
UpdateData(false);
// TODO: 在此添加控件通知处理程序代码
}
(2)写注册表
1在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为DWORD,值为6。
void OnBnClickedChange()//响应按钮IDC_CHANGE
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
HKEY hTempKey;
DWORD dwValue = 6;
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD;
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))
{//背景色
if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_DWORD, (CONST BYTE*)&dwValue, sizeof(DWORD)))
{
AfxMessageBox(_T("错误"));
::RegCloseKey(hKey);
return;
}
}
}
::RegCloseKey(hKey);
// TODO: 在此添加控件通知处理程序代码
}
2在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_SZ,值为China。
void OnBnClickedChange()
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
HKEY hTempKey;
CString m_name = "China";
LPBYTE m_name_Set = CString_To_LPBYTE(m_name);//定义x轴名称
DWORD length = m_name.GetLength() + 1;//定义数据长度
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))
{
if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, m_name_Set, length))
{
AfxMessageBox(_T("错误"));
::RegCloseKey(hKey);
return;
}
}
}
::RegCloseKey(hKey);
UpdateData(false);
// TODO: 在此添加控件通知处理程序代码
}
3在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_ BINARY,值为ff ac 05 4e。
void OnBnClickedChange()
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
HKEY hTempKey;
BYTE m_name[10];
memset(m_name, 0, sizeof(m_name));//将数组m_name清零
m_name[0] = 0xff;
m_name[1] = 0xac;
m_name[2] = 0x05;
m_name[4] = 0x4e;
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))
{
if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY,(unsigned char *)m_name,5))
{
AfxMessageBox(_T("错误"));
::RegCloseKey(hKey);
return;
}
}
}
::RegCloseKey(hKey);
UpdateData(false);
// TODO: 在此添加控件通知处理程序代码
}
(3)删除注册表
1删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司//test111的键值Name
void OnBnClickedDelete()
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司//test111");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS != ::RegDeleteValue(hKey, _T("Name")))
{
AfxMessageBox(_T("错误"));
::RegCloseKey(hKey);
return;
}
}
::RegCloseKey(hKey);
UpdateData(FALSE);
// TODO: 在此添加控件通知处理程序代码
}
2删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司下的子键
test111。
void OnBnClickedDelete()
{
HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
//打开与路径data_Set相关的hKEY
LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
{
// 使用hKey来操作data_Set这个KEY里面的值。
if (ERROR_SUCCESS != ::RegDeleteKey(hKey, "test111"))
{
AfxMessageBox(_T("错误"));
::RegCloseKey(hKey);
return;
}
}
::RegCloseKey(hKey);
UpdateData(FALSE);
// TODO: 在此添加控件通知处理程序代码
}