366上位机VC MFC打开关闭注册表获取键值信息
打开关闭注册表获取键值信息
功能展示
在现实的注册表编程操作中我们常常需要打开,关闭注册表,获取子键/键值的信息比如:子键/键值的数量,长度,以及数据的最大长度等等,这也是注册表操作的基础。注册表的信息可以通过RegQueryInfoKey函数来获取,我们当前例程就实现了注册表的打开,子键信息获取,关闭注册表的功能,效果如图。在输入了根键,子键后点击按钮就可获取指定子键的相关信息,并显示在列表框中;
要点提示
1. 注册表的组织方式跟文件目录比较相似,主要分为根键、子键和键值项三部分,与文件目录对应的话就是根目录、子目录和文件。分别介绍一下这三部分:
(1)根键。分为5个,分别为
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS和HKEY_CURRENT_CONFIG
把它们理解成磁盘的五个分区可以了。
(2)子键。可以有多个子键和键值项,就像一个目录中可以有多个子目录和多个文件一样。
(3)键值项。可以理解为文件,它由三部分组成,分别为?:名称、类型、数据。
?类型又分为多种主要包括如下:
REG_BINARY 二进制数据
REG_DWORD 32位双字节数据
REG_SZ以 0结尾的字符串
REG_DWORD_BIG_ENDIAN 高位排在底位的双字
REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%
REG_LINK UNICODE 符号链接
REG_RESOURCE_LIST 设备驱动程序资源列表
REG_MULTI_SZ ?多字符串
注册表数据项的数据类型有8种,但最常用的主要是前3种。
2.在对注册表操作前应该先打开指定的键,然后通过键的句柄进行操作,打开键句柄可以用API??RegOpenKeyEx来实现,其原形:RegOpenKeyEx(hKey, //父键句柄
lpSubKey, //子键句柄
dwOptions, //系统保留,指定为0
samDesired, //打开权限
phkResult, //返回打开句柄
);
其中打开权限有多种,具体可查阅MSDN手册,?想方便的话可以指定为KEY_ALL_ACCESS?,这样什么权限都有了,当函数执行成功时返回ERROR_SUCCESS。
3.获取子键/键值信息
在现实的编程操作中我们常常需要获取子键/键值的信息比如:子键/键值的数量,长度,以及数据的最大长度等等,这些信息可以通过RegQueryInfoKey函数来获取。
它的原型: RegQueryInfoKey(
hkey, //要获取信息的句柄
lpClass, //接受创建健时的Class字符串
lpcbClass, //lpClass的长度
pReserved, //系统保留,指定为0
lpcSubKeys, //子键数量
lpcbMaxSubKeyLen, //子键中最长名称的长度
lpcbMaxClassLen, //子键中最长Class字符串长度
lpcVlaues, //键值数量
lpcbMaxValueNameLen, //键值项中最长名称的长度
lpcbMaxValueLen, //键值项数据最大长度
lpcbSecurityDescriptor, //安全描述符长度
lpftLastWriteTime, //FILETIME结构,最后修改时间
);
这个函数的参数很多,实际使用时,只填写自己需要的就行了,不需要的可以放个NULL就行。还有一点需要注意就是它所返回的长度都不包括结尾的0字符,所以在使用时应该用长度+1。
实现功能
1.新建基于对话框的应用程序
2.添加列表控件,关联变量用于显示获得的自信CListCtrl m_List;添加编辑框IDC_EDIT1,IDC_EDIT2,及按钮<获得第一键值项>关联按钮的点击函数
void CGkbc8Dlg::OnGet()
{
HKEY key,hRootKey;
CString sRootKey,sSubKey;
GetDlgItemText(IDC_EDIT1,sRootKey);//获取输入根键
GetDlgItemText(IDC_EDIT2,sSubKey);//获取子键
if(sSubKey.IsEmpty()||sRootKey.IsEmpty())//编辑框没输入内容返回
return;
//<> 除95,NT系统外,总共有五个根键
if(!sRootKey.Compare("HKEY_CLASSES_ROOT") )//相同时
hRootKey = HKEY_CLASSES_ROOT;
else if(!sRootKey.Compare("HKEY_CURRENT_CONFIG") )
hRootKey = HKEY_CURRENT_CONFIG;
else if(!sRootKey.Compare("HKEY_CURRENT_USER") )
hRootKey = HKEY_CURRENT_USER;
else if(!sRootKey.Compare("HKEY_LOCAL_MACHINE") )
hRootKey = HKEY_LOCAL_MACHINE;
else if(!sRootKey.Compare("HKEY_USERS") )
hRootKey = HKEY_USERS;
else
{
MessageBox("输入根键非法");
return;
}
//<>
if(RegOpenKeyEx(hRootKey,sSubKey,0,KEY_ALL_ACCESS,&key) == ERROR_SUCCESS)
{
DWORD SubkeyNum,SubKeyMaxLen,ValueNum,ValueNameMaxLen,ValueMaxLen;
if(RegQueryInfoKey(key,NULL,NULL,NULL,
&SubkeyNum,&SubKeyMaxLen,NULL,&ValueNum,&ValueNameMaxLen,&ValueMaxLen,NULL,NULL)==ERROR_SUCCESS)
{
CString sText;
sText.Format("子键数量:%d",SubkeyNum);
m_List.InsertItem(0,sText);
sText.Format("子键中最长名称的长度:%d",SubKeyMaxLen);
m_List.InsertItem(1,sText);
sText.Format("键值数量:%d",ValueNum);
m_List.InsertItem(2,sText);
sText.Format("键值项中最长名称的长度:%d",ValueNameMaxLen);
m_List.InsertItem(3,sText);
sText.Format("键值项数据最大长度:%d",ValueMaxLen);
m_List.InsertItem(4,sText);
}
else
MessageBox("RegQueryInfoKey错误");
}
else
MessageBox("注册表打开失败");
RegCloseKey(key);
}
3.在程序初始化时初始化控件
m_List.ModifyStyle(0,LVS_REPORT,NULL);
m_List.InsertColumn(0,"子键及其键值信息",LVCFMT_LEFT,700);
SetDlgItemText(IDC_EDIT1,"HKEY_LOCAL_MACHINE");
SetDlgItemText(IDC_EDIT2,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|