注册表函数RegEnumValue()如何正确使用?
我是这样用的:
int num=0;
char str[20]; 
DWORD th=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD suc;
::RegOpenkey(……);
suc=::RegEnumValue(hkey,(dword)num,str,NULL,&type,strv,&vl);
一运行,说变量有错,(我在vb6.0中使用可以,怎么在vc里却不下?)
请高手解答!!谢谢! 

解决方案 »

  1.   

    type = REG_DWORD;
    suc=::RegEnumValue(hkey, (dword)num, str, NULL, &type, strv, &vl);
      

  2.   

    给段例子给你吧: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;
    }
      

  3.   

    long index=0;
    long lresult=0;
    char valuename[254];
    dword dwcvaluename=254;
    dword dwtype;
    dword dwcount=254;
    cstring data;
    lresult=RegEnumValue(hkey,index,valuename,&dwcvaluename,null,&dwtype,null,&dwcount);
    这是我自己用过的代码,没错!!!
      

  4.   

    win98+vc6
    chui168的可以运行!!
    pomelowu(羽战士):编译时出错为:error C2018: unknown character '0xa1',有23个.
    但vchui168运行时,查到index为5时,lresult就不能正确,index为4时,valuename的值,
    即获取的项名少几个字母,
    有那位好心的高手,帮帮忙,救我出水火,必有厚谢!!
      

  5.   

    我的例子也有,我以前用vb6.0编写过注册表编辑器,现想改用vc编写,我感到vc有时比较繁琐,难.
    我想搜索HKEY_CURRENT_USER\Control Panel\\desktop下的所有项名称,放在例表里,代码如下:
            int index=0;
    long lresult=0;
    char valuename[254];
    DWORD dwcvaluename=254;
    CString data;
    valuename[0]='\0';
             DWORD dwtype;
    DWORD dwcount =254;
        ::RegOpenKey(HKEY_CURRENT_USER,"Control Panel\\desktop",&hkey);   
    CListBox *pListBox=(CListBox*)GetDlgItem(IDC_LIST1);
    do { lresult=RegEnumValue(hkey,index,valuename,&dwcvaluename,NULL,&dwtype,NULL,&dwcount);
           
         pListBox->AddString(valuename);
                  index++;
    }    
    while (lresult == ERROR_SUCCESS);
    RegCloseKey(hkey);
    }出现的现象是:查到index为5时,lresult就不能正确,index为4时,valuename的值,
    即获取的项名少几个字母,
      如果被搜索的项名称(valuename)是一个字母,或项的名称是文字"1"或"2"这样的,valuename就
    是空的.
      

  6.   

    pomelowu(羽战士):今天编译成功!!
    本人是初学者,有几点不明之处,请给予指点!
    tcKeyName = new TCHAR[lLongestKeyNameLen];
     pbbinKeyData = new BYTE[lLongestDataLen];
    memset(pbbinKeyData, 0, lLongestDataLen);
      memset(tcKeyName, 0, lLongestKeyNameLen);
    尤其以上4句,是起什么作用???
      

  7.   

    不好意思,才看到你的回帖
    这四个语句,前两个,开辟内存空间,用于保存Key的名字和数据,
    后两句用来把刚才开辟的空间全部清零。