关于 RegEnumValue 函数的一点问题,请指教,谢谢!

as2001 2004-07-01 12:40:56
LONG RegEnumValue(
HKEY hKey, // handle to key to query
DWORD dwIndex, // index of value to query
LPTSTR lpValueName, // address of buffer for value string
LPDWORD lpcbValueName, // address for size of value buffer
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for type code
LPBYTE lpData, // address of buffer for value data
LPDWORD lpcbData // address for size of data buffer
);

以上是该函数的原型,其中 lpValueName 是返回键值项数据的项名,但为什么例如“MediaPathUnexpanded”的项名,它只返回其中前面部分,就好像“MediaPathUn”,后面的就不见了,我百思不知其所,特此指教于诸位大虾!
...全文
423 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
as2001 2004-07-02
  • 打赏
  • 举报
回复
谢谢!!试过,可以的,谢谢!!pomelowu(羽战士)
as2001 2004-07-01
  • 打赏
  • 举报
回复
自己先占一楼!
carbon107 2004-07-01
  • 打赏
  • 举报
回复
LPTSTR lpValueName先用变量存起来,只要存的空间够,应该可以显示出的吧
pomelowu 2004-07-01
  • 打赏
  • 举报
回复
给段例子:

HKEY hKey = NULL;
long lKeyRet = 0;

DWORD dwIndexKey = 0;

char *keyname = NULL;

DWORD dwSubKeys = 0;
DWORD dwMaxSubKeyLen = 0;
DWORD dwValues = 0;
DWORD dwMaxValueNameLen = 0;
DWORD dwMaxValueLen = 0;

// 获取所有的子键
if (ERROR_SUCCESS != RegOpenKeyEx(hRoot, strSubKey,
NULL,
KEY_ALL_ACCESS, &hKey))
return FALSE;

if (ERROR_SUCCESS != RegQueryInfoKey(hKey,
NULL, NULL,
NULL,
&dwSubKeys, // 子键数
&dwMaxSubKeyLen,
NULL,
&dwValues, // 值数
&dwMaxValueNameLen,
&dwMaxValueLen,
NULL,
NULL
))
{
RegCloseKey(hKey);
return FALSE;
}

keyname = new char[dwMaxSubKeyLen+1];
if (NULL == keyname)
return FALSE;

listKeys.SetSize(dwSubKeys);
listKeys.RemoveAll();
do
{
memset(keyname, NULL, dwMaxSubKeyLen);
lKeyRet = RegEnumKey(hKey, dwIndexKey++, keyname, dwMaxSubKeyLen+1);
if (ERROR_SUCCESS == lKeyRet)
{
listKeys.Add(keyname);
}
}while (lKeyRet != ERROR_NO_MORE_ITEMS);

delete []keyname;
keyname = NULL;

RegCloseKey(hKey);

pomelowu 2004-07-01
  • 打赏
  • 举报
回复
void CRegExplorerView::EnumerateValues(HKEY hKey, LPCTSTR cstrKey)
{
 static HKEY hLastKey = hKey;
 LONG lResult;
 DWORD dwIndex = 0;
 HKEY hCurKey = hKey;
 DWORD dwKeyType;
 DWORD dwKeyDataLength, dwKeyNameLen;
 LPBYTE pbbinKeyData = NULL;
 TCHAR *tcKeyName = NULL;
 TCHAR tcDataType[1024] = _T("");
 lResult = RegOpenKeyEx(hCurKey, cstrKey, 0, KEY_QUERY_VALUE , &hKey);
 if(lResult != ERROR_SUCCESS)
  return;
 DWORD lNoOfValues = 0;
 DWORD lLongestKeyNameLen = 1;
 DWORD lLongestDataLen = 1;

 lResult = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &lNoOfValues, &lLongestKeyNameLen, &lLongestDataLen,NULL, NULL);

 if(lResult != ERROR_SUCCESS)
  return;
 hLastKey = hKey;
 lLongestKeyNameLen++;
 lLongestDataLen++;
 tcKeyName = new TCHAR[lLongestKeyNameLen];
 pbbinKeyData = new BYTE[lLongestDataLen];
 CString cstrFinalData, cstrTemp;
 while(TRUE)
 {
  memset(pbbinKeyData, 0, lLongestDataLen);
  memset(tcKeyName, 0, lLongestKeyNameLen);
  dwKeyType = dwKeyDataLength = dwKeyNameLen = 0;
  dwKeyNameLen = lLongestKeyNameLen;
  dwKeyDataLength = lLongestDataLen;
  lResult = RegEnumValue(hKey, dwIndex, tcKeyName, &dwKeyNameLen, NULL, &dwKeyType, pbbinKeyData, &dwKeyDataLength);
  if(lResult == ERROR_NO_MORE_ITEMS)
   break;
  AddRegistryItem(tcKeyName, dwKeyType, pbbinKeyData, dwKeyDataLength, dwIndex);//显示数据于ListView
  dwIndex++;
 }
 RegCloseKey(hKey);
 delete tcKeyName;
 delete pbbinKeyData;
}

as2001 2004-07-01
  • 打赏
  • 举报
回复
问题还是没有解决,继续学习中~~~~
Zark 2004-07-01
  • 打赏
  • 举报
回复
1. 在你调用此函数前,你必须准备好缓冲区lpValueName.
2. 你必须保证这个缓冲区足够的大,能够容纳下Value Name.
3. 你的问题可能出在没有准备缓冲区这一条上.
as2001 2004-07-01
  • 打赏
  • 举报
回复
还是不行,可以具体点吗?谢谢!
pomelowu 2004-07-01
  • 打赏
  • 举报
回复
应该不会啊,通过RegQueryInfoKey可以获得value name的最大长度的(参数lpcMaxValueNameLen),RegEnumValue中lpValueName开辟的空间比lpcMaxValueNameLen大就行了啊

16,472

社区成员

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

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

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