请教注册表问题

CslQy 2003-12-12 12:23:07
本人想枚举出一个KEY下面所有的value,但用RegEnumValue总是不能将其下面的Value全部枚举出来。请问怎么解决?
...全文
49 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohedou 2003-12-16
  • 打赏
  • 举报
回复
关键是你第二次读的时候要对dwBufLen赋值:
dwBufLen = sizeof(dwdata);
lRet = RegQueryValueEx(hKey, _T("LinkCount"), NULL, NULL, (LPBYTE)&dwdata, &dwBufLen);
afantict 2003-12-16
  • 打赏
  • 举报
回复
我有代码:
你是不是不光要列举value,也要key阿
下面的递归可以实现

VOID CommonFunc::GetInfoFromReg(CString strRegPath, HANDLE hInstall, HANDLE hSecond)
{
// TODO: Add extra validation here
CString strTemp;
CString strTmp;
CString strWrite;
HKEY hKey;
LONG lRet;
DWORD dwdata;
DWORD dwBufLen;
int i;
TCHAR szProductType[MAX_VALUE_NAME];
TCHAR achKey[MAX_PATH];

//2003-12-3
CHAR lpBuffer[1024*3];
memset(lpBuffer, 0, sizeof(lpBuffer));
//end
lRet = 0L;
dwdata = 0L;
dwBufLen = MAX_VALUE_NAME;
i = 0;
memset(szProductType, 0, sizeof(szProductType));
memset(achKey, 0, sizeof(achKey));

if((hInstall == INVALID_HANDLE_VALUE) && (hSecond == INVALID_HANDLE_VALUE))
return;
if(strRegPath != COMP_TARGET_PATH)
{
//link dir 1
strTemp = strRegPath.Right(strRegPath.GetLength()-56) + _T(",");
strWrite += strTemp;
if(RegOpenKeyEx( HKEY_LOCAL_MACHINE, strRegPath, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
//read linkcount 2
dwdata = 0L;
dwBufLen = sizeof(dwdata);
lRet = RegQueryValueEx(hKey, _T("LinkCount"), NULL, NULL, (LPBYTE)&dwdata, &dwBufLen);
if(lRet != ERROR_SUCCESS)
{
RegCloseKey(hKey);
strWrite += _T("0,");
}
else
{
strTemp.Format(_T("%ld"), dwdata);
strWrite += strTemp + _T(",");
}
//read linkpoint 3
dwBufLen = MAX_VALUE_NAME;
memset(szProductType, 0, sizeof(szProductType));
lRet = RegQueryValueEx(hKey, _T("LinkPoint"), NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
strWrite += _T(",,,,,0,0,,0,,,,,0,,1,0,512,0,,0,,\n");
}
else
{
strTemp = szProductType;
strWrite += strTemp + _T(",");
strTmp = LINK_DATA_PATH;
//link dir
strTmp = strTmp + _T("\\RAW\\") + strTemp;
if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, strTmp, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
strWrite += _T(",,,,0,0,,0,,,,,0,,1,0,512,0,,0,,\n");
}
else
{
strTmp = GetLinkDirInfoFromReg(hKey);
RegCloseKey(hKey);
strWrite += strTmp;
//media set
strTmp = LINK_DATA_PATH;
strTmp = strTmp + _T("\\MediaSet\\") + strTemp;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, strTmp, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{
strTmp = GetMediaSetInfoFromReg(hKey);
RegCloseKey(hKey);
strWrite += strTmp + _T("\n");
}
else
{
strWrite += _T(",\n");
}
}
}
}
else
{
strWrite += _T("0,,,,,,0,0,,0,,,,,0,,1,0,512,0,,0,,\n");
}
WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)strWrite, strWrite.GetLength()*sizeof(TCHAR)+1,
lpBuffer, (strWrite.GetLength()*sizeof(TCHAR)+1)*2, NULL, NULL);
if(hInstall != INVALID_HANDLE_VALUE)
WriteFile(hInstall, lpBuffer, strlen(lpBuffer), &dwBufLen, NULL); //Write to install path
if(hSecond != INVALID_HANDLE_VALUE)
WriteFile(hSecond, lpBuffer, strlen(lpBuffer), &dwBufLen, NULL); //write to second path
}
//rescue
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPath, 0, KEY_ENUMERATE_SUB_KEYS, &hKey) == ERROR_SUCCESS)
{
for (i = 0, lRet = ERROR_SUCCESS; lRet == ERROR_SUCCESS; i++)
{
memset(achKey, 0, sizeof(achKey));
dwBufLen = MAX_PATH;
lRet = RegEnumKeyEx(hKey, i, achKey, &dwBufLen, NULL, NULL, NULL, NULL);
if (lRet == (DWORD)ERROR_SUCCESS)
{
GetInfoFromReg(strRegPath + _T("\\") + achKey, hInstall, hSecond);
}
}
}
}

Zark 2003-12-15
  • 打赏
  • 举报
回复
别那么偷懒,请写完整,只就你的例子来看,应改为

for( int iValueIndex = 0; ; ++iValueIndex )
{
LONG lRet=RegEnumValue(........);
if(lRet!=ERROR_SUCCESS)
break;

if(lRet==ERROR_NO_MORE_ITEMS)
break;

//- TODO
}
Zark 2003-12-12
  • 打赏
  • 举报
回复
RegEnumValue就是用来枚举所有的value的,为什么你"总是不能将其下面的Value全部枚举出来"? 写法错了吧? 贴代码来看.
CslQy 2003-12-12
  • 打赏
  • 举报
回复
Code:

for( int iValueIndex = 0; ; ++iValueIndex )
{
if( ERROR_MORE_DATA == RegEnumValue(........) )
{

break;
}
}

16,551

社区成员

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

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

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