2010-05-13 3 views
0
DWORD type = REG_NONE; 
int i = 0; 
size = sizeof(ValueName); 
size2 = sizeof(ValueData); 
BOOL bContinue = TRUE; 

do 
{ 
    lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2); 
    switch(lRet) 
    { 
    case ERROR_SUCCESS: 
    print_values(ValueName , type , ValueData , size2); 
    i++; 
    size = sizeof(ValueName); 
    size2 = sizeof(ValueData); 
    break; 
    case ERROR_MORE_DATA: 
    size2 = sizeof(ValueData); 
    if(NULL != ValueData) delete [] ValueData; 
    ValueData = new BYTE[size2]; 
    break; 
    case ERROR_NO_MORE_ITEMS: 
    bContinue = false; 
    break; 
    default: 
    cout << "Unexpected error: " << GetLastError() << endl; 
    bContinue = false; 
    break; 
    } 
}while(bContinue); 

он всегда отправляется в ERROR_NO_MORE_DATA, почему? : -/Помощь с значениями перечисления в реестре C++

EDIT:

извините, я Мента: ERROR_MORE_DATA :) я что-то изменилось, по-прежнему не работает

class Registry { 
public: 
    Registry(); 
    ~Registry(); 
    bool open_key_ex(HKEY hkey, const char * key, HKEY & hkey_out); 
    void querry_info_key(HKEY); 
    void enum_key(HKEY , DWORD); 
    void enum_value(HKEY); 
    void print_values(LPCSTR , DWORD , LPBYTE , DWORD); 
    void run(); 
private: 
    HKEY hkey; 
    long lRet; 
    FILETIME filetime; 
    DWORD sub_keys; 
    TCHAR* ValueName; 
    DWORD size; 
    LPBYTE ValueData; 
    DWORD size2; 
    HKEY a; 
    DWORD MaxValueLen; 
    DWORD MaxDataLen; 

}; 

Registry::Registry() 
{ 
    ValueName = new TCHAR[MAX_PATH]; 
    ValueData = NULL; 
    MaxValueLen = MAX_PATH + 1; 
    MaxDataLen = 0; 
} 

Registry::~Registry() 
{ 
    delete [] ValueName; 
} 

void Registry::enum_value(HKEY Hkey) 
{ 
    DWORD type = REG_NONE; 
    int i = 0; 
    size2 = MaxDataLen; 
    BOOL bContinue = TRUE; 

    do 
    { 
     lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2); 
     size = MaxValueLen; 
     switch(lRet) 
     { 
     case ERROR_SUCCESS: 
      print_values(ValueName , type , ValueData , size2); 
      size2 = MaxDataLen; 
      i++; 
      break; 
     case ERROR_MORE_DATA: 
      MaxDataLen = size2; 
      if(NULL != ValueData) delete [] ValueData; 
      ValueData = new BYTE[MaxDataLen]; 
      break; 
     case ERROR_NO_MORE_ITEMS: 
      bContinue = false; 
      break; 
     default: 
      cout << "Unexpected error: " << GetLastError() << endl; 
      bContinue = false; 
      break; 
     } 
    }while(bContinue); 
} 
+0

Для дальнейшего использования, пожалуйста, используйте кнопку «101010», чтобы отметить код. Этот сайт использует Markdown. –

+2

Вы говорите, что он всегда идет в ERROR_NO_MORE_DATA, но есть случаи для ERROR_MORE_DATA и ERROR_NO_MORE_ITEMS. Что он? Вы также должны предоставить больше кода; какие значения ValueName и ValueData определены как? –

+0

Что вы подразумеваете под «все еще не работает»? Та же проблема? –

ответ

1

Я подозреваю, что это связано с этим:

size2 = sizeof(ValueData); 

Хотя Я не вижу объявления для ValueData, очевидно, что это указатель, а не массив. Поэтому sizeof даст вам размер указателя, а не размер буфера, на который он указывает. Вам нужно будет следить за размером самостоятельно. То же самое можно сказать и о ValueName, но я не могу сказать.

От http://msdn.microsoft.com/en-us/library/ms724865%28VS.85%29.aspx:

Если буфер указан lpData является не достаточно большой, чтобы держать данные, функция возвращает ERROR_MORE_DATA и сохраняет требуемый размер буфера в переменной указывает lpcbData. В этот случай, содержимое lpData равно undefined.

Смежные вопросы