注册表获取子类项目的问题

lin6194 2010-11-27 12:11:48

//SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318} 相同类名存在多项
lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318}",0, KEY_ALL_ACCESS, &hKey);
if(lReg != ERROR_SUCCESS)
{
printf( "Open Registry Error!\n ");
return ab_SetErrorKs(KS_ERR_FAILED);
}

//查询子项数量
memset(szSubKey, 0, sizeof(szSubKey));
lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueNumber, &dwMaxValueLen, NULL, NULL, NULL);
if(lReg != ERROR_SUCCESS)
{
printf( "Getting Info Error!\n ");
return ab_SetErrorKs(KS_ERR_FAILED);
}

//这里遍历所有“{4D36E978-E325-11CE-BFC1-08002BE10318}”项目,找出我要的Ports
for(i = 0; i < dwValueNumber; i ++)
{
dwValueNameLen = sizeof(szValueName);
memset(szValueName, 0, sizeof(szValueName));
lReg = RegEnumValueA(hKey, i, szValueName, &dwValueNameLen, NULL, NULL, NULL, NULL);
if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
{
printf( "Enum Registry Error!\n");
return ab_SetErrorKs(KS_ERR_FAILED);
}
dwValueNameLen = sizeof(szValueName);
memset(szValueName, 0, sizeof(szValueName));
lReg = RegQueryValueExA(hKey, szValueName, NULL, NULL, (LPBYTE)szValueName, &dwValueSize);
if ((lReg != ERROR_SUCCESS) && (lReg != ERROR_NO_MORE_ITEMS))
{
continue;
}
if(strstr(szValueName, "Ports"))
{
printf("\r\n ++++ szComName: %s\r\n", szValueName);
break;
}
}

//获取Ports子项目的数量,运行正常
lReg = RegQueryInfoKeyA(hKey, NULL, NULL, NULL, &dwValueNumber, &dwMaxValueLen, NULL, NULL, NULL, NULL, NULL, NULL);
printf("\r\n .... dwValueNumber = %d, dwMaxValueLen = %d\r\n\r\n", dwValueNumber, dwMaxValueLen);

//这里我已经找出该项目的子项目,名称为了0000,0001,0002等
for(i = 0; i < dwValueNumber; i ++)
{
memset(szValueName, 0, sizeof(szValueName));
dwValueNameLen = sizeof(szValueName);
lReg = RegEnumKeyExA(hKey, i, (LPBYTE)szValueName, &dwValueNameLen, NULL, NULL, NULL, NULL);
if(lReg != ERROR_SUCCESS)
continue;
printf("\r\n %s", szValueName);
}


我试着用RegQueryValueExA(hKey, szValueName, NULL, NULL, (LPBYTE)szValueName, &dwValueSize);查找内容,但是得到的不是子项目的数据,还是主项目的名称。现在我就卡在如何将hKey修改到某一子项上,我好读取子项内容

我想请教的是,如何获取“{4D36E978-E325-11CE-BFC1-08002BE10318}\\0000”所包含的项目值。一般情况下关闭项目目录名称,重新打开注册表就可以读取。但是这里我要找的{4D36E978-E325-11CE-BFC1-08002BE10318}存在十几项,关闭注册表,再次打开时,已经无法找到正确的,也就是上面所找到类型名称为“Ports”的项目。[/color]

总之就是想请教各位,在这种情况下如何得到“{4D36E978-E325-11CE-BFC1-08002BE10318}\\0000”子项目的项目值。
...全文
400 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin6194 2010-11-27
  • 打赏
  • 举报
回复
多谢,问题解决了,结贴
BombZhang 2010-11-27
  • 打赏
  • 举报
回复
你要把键“SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318}\\0000”再打开才能用获取的句柄查询“SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318}\\0000”

RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318}\\0000",0, KEY_ALL_ACCESS, &hSubKey);

hKey打开的是SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E978-E325-11CE-BFC1-08002BE10318}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧