369上位机VC MFC获取子键的全部键值项信息
获取子键的全部键值项信息
功能展示
如文件夹内会有很多文件一样,注册表的子键内也会有很键值项,我们当前例程实现获取指定子键Themes下的全部键值项信息,效果如图。点击按钮后,例程会获得Themes子键下的全部键值项信息,也就是会获取系统当前用户的桌面主题信息,并全部显示出来
要点提示
全部键值项的获取可以通过枚举实现,也就是通过函数RegEnumValue()完成,其函数原型如下:
RegEnumValue(
hkey, //被枚举的键句柄
dwIndex, //子键索引编号
lpValueName, //键值名称
lpcbValueName, //键值名称长度
lpReserved, //系统保留,指定为0
lpType, //键值数据类型
lpDate, //键值数据
lpcbDate //键值数据长度
);
要注意的是与枚举子键相似,在每次循环中应该重新设置?键值名称长度lpcbValueName 及键值数据长度lpcbDate,不然会读取失败;
实现功能
1.新建基于对话框的应用程序
2.添加列表控件关联变量CListCtrl m_List;并初始化
m_List.ModifyStyle(0,LVS_REPORT,NULL);
m_List.InsertColumn(0,"Name",LVCFMT_LEFT,200);
m_List.InsertColumn(1,"Type",LVCFMT_LEFT,100);
m_List.InsertColumn(2,"Data",LVCFMT_LEFT,700);
3.添加自定义函数AllRegKeyValue(),并添加按钮控件<获取全部键值项信息>进行调用
BOOL CGkbc8Dlg::AllRegKeyValue(HKEY hRootKey, CString sSubKey)
{
HKEY hSubKey;
long lResult;
lResult = RegOpenKeyEx(hRootKey, sSubKey, 0, KEY_READ, &hSubKey);// 打开注册表
if(ERROR_SUCCESS != lResult)
return FALSE;
//<>
const UINT nSize = 256;
UINT nIndex = 0; //枚举索引
CString sTemp;
TCHAR Name[nSize] = {0}; // 键/值名称
DWORD NameSiz = nSize*sizeof(TCHAR);
DWORD Type = REG_SZ; // 值类型
TCHAR sData[nSize] = {0}; // 值数据
DWORD DataSiz = nSize*sizeof(TCHAR);
lResult = RegEnumValue(hSubKey,nIndex,Name,&NameSiz,0,&Type, (unsigned char *)sData, &DataSiz);
while (lResult == ERROR_SUCCESS)
{
m_List.InsertItem(m_List.GetItemCount(), "");//插入一行
m_List.SetItemText(m_List.GetItemCount()-1, 0, Name);
if(Type == REG_BINARY) sTemp = "REG_BINARY"; //二进制数据
if(Type == REG_DWORD) sTemp = "REG_DWORD"; //32位双字节数据
if(Type == REG_SZ) sTemp = "REG_SZ"; //以0结尾的字符串
if(Type == REG_DWORD_BIG_ENDIAN) sTemp = "REG_DWORD_BIG_ENDIAN"; //高位排在底位的双字
if(Type == REG_EXPAND_SZ) sTemp = "REG_BINARY"; //扩展字符串,可以加入变量如%PATH%
if(Type == REG_LINK) sTemp = "REG_LINK"; //UNICODE 符号链接
if(Type == REG_RESOURCE_LIST) sTemp = "REG_RESOURCE_LIST"; //设备驱动程序资源列表
if(Type == REG_MULTI_SZ) sTemp = "REG_MULTI_SZ"; //多字符串
m_List.SetItemText(m_List.GetItemCount()-1, 1, sTemp);
m_List.SetItemText(m_List.GetItemCount()-1, 2, sData);
nIndex++;
NameSiz = nSize*sizeof(TCHAR);//必须重新赋值
DataSiz = nSize*sizeof(TCHAR);
lResult = RegEnumValue(hSubKey,nIndex,Name,&NameSiz,0,&Type, (unsigned char *)sData, &DataSiz);
}
RegCloseKey(hSubKey);
return TRUE;
}
void CGkbc8Dlg::OnGet()
{
AllRegKeyValue(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Themes");//电脑主题相关信息
}
我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|