QQ登录

只需一步,快速开始

366上位机VC MFC打开关闭注册表获取键值信息

[ 复制链接 ]

366上位机VC MFC打开关闭注册表获取键值信息

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");

我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:366.上位机VC MFC打开关闭注册表获取键值信息.zip 
文件大小:136.21 KB  售价:11金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索