Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: RegEnumKey настырно возвращает ERROR_NO_MORE_ITEMS ...  (Прочитано 16976 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 12-10-2006 13:29 » 

Господа,

кто-нибудь сталкивался с такой ситуацией:

в реестре есть папка, содержащая несколько ключей, которые очень хочется считать. Например:

Папка: SOFTWARE\Irina:
 
StringID  REG_SZ    123
Flag      REG_SZ    1
Info      REG_SZ    12
Msg       REG_SZ    мяу

Напрашивается самый простой вариант - применение функции RegEnumKey (ну или RegEnumKeyEx). И вот тут-то и поджидает Облом Иваныч - эта функция стойко возвращает ERROR_NO_MORE_ITEMS, хотя в папке 4 записи!

Код:

BOOL MySysInfo::OpenRegKey(const HKEY hKey, const TCHAR* pSubKey, HKEY& hKeyPrograms, REGSAM samDesired /* = KEY_READ*/)
{
if (NULL == pSubKey) return FALSE;
ULONG res;

    res = RegOpenKeyEx( hKey,
LPCTSTR(pSubKey),
0,samDesired,
&hKeyPrograms);
if (res != ERROR_SUCCESS)
{
return FALSE;
}

return TRUE;
}


BOOL MySysInfo::CloseRegKey(HKEY hKey)
{
ULONG res;
res = RegCloseKey( hKey );
if (res != ERROR_SUCCESS)
{
return FALSE;
}

return TRUE;
}

void MySysInfo::FindAllSubKeys(HKEY hKeyBase, CString csKeyPath)
{
HKEY hKey = NULL;
BOOL bRes = FALSE;

// open registry
bRes = OpenRegKey(hKeyBase, LPCTSTR(csKeyPath), hKey);
if (bRes == TRUE)
{
int lasterror = ERROR_SUCCESS;
int nIndex = 0;

while (lasterror == ERROR_SUCCESS || lasterror == ERROR_MORE_DATA)
{
DWORD dwName = (MAX_PATH + 1) * sizeof (TCHAR);
TCHAR chName[MAX_PATH + 1];
_tcscpy (chName, _T(""));
lasterror = ::RegEnumKeyEx(hKey, nIndex, chName, dwName);
                        // при первом же вызове она меня отсылает подальше,
                        // правда, корректно ;-) Самое забавное заключается в том,
                       //что RegEnumValue() работает как часы! И все находит!  ::)

nIndex++;
}

// close registry
CloseRegKey(hKey);
}
}

Вызов:

FindAllSubKeys( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Irina") );

Короче говоря, я не знаю уже, чего эта функция от меня хочет, зато точно знаю, что не понимаю ее поведение!  :dontknow:
« Последнее редактирование: 07-12-2007 19:49 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 12-10-2006 13:42 » 

Иришка - это нормально. Какая винда? w2k XP?

ps Ещё рег-файл кинь этого куска.

зызы Какая студия? 6 SP6?

а ну и ещё до кучи - проект UNICODE?
« Последнее редактирование: 12-10-2006 13:48 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 12-10-2006 14:21 » 

Джон, солнышко,

почему нормально???
Винда = xp, проект = unicode, студия = 6SP6.

По общей логике вещей RegEnumKey() и RegEnumValue() должны работать по сходной схеме. Тем не менее этого не наблюдается...

Проблема возникла по следующему поводу:
в проекте уже есть папка в реестре, в которой сохраняют определенные настройки. Мне надо загнать туда свою папочку (т.е. subdirectory), в которой у меня будут сохраняться некоторые данные. Все это должно быть сделано так, чтобы можно было считывать из реестра всю инфу, зная только основной путь + имя моей папки (и не зная типов данных и имен параметров).
Вот я и захотела использовать RegEnumKey(), чтобы считать имена всех параметров, потом с помощью RegQueryMultipleValues() выяснить тип каждого параметра и потом с помощью RegEnumValue() или RegQueryValueEx() считать его значение.
Итого - идея проста, как чайник со свистком, но мелочи не дают радоваться жизни ;-(
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 12-10-2006 14:23 » new

замени RegEnumKeyEx на RegEnumKey и радуйся. Ага

зы Я сегодня до шести буду на работе - однозначно.
« Последнее редактирование: 12-10-2006 14:25 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 12-10-2006 15:09 » 

Фигушки! От перемены мест слагаемых сумма не меняется! Т.е. ничегошеньки не работает Ага  Но я все равно радуюсь Ага
Ага, хорошо, я тут тоже сегодня до 7 вечера как минимум. После 6 позвоню.
Майл отправила.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 12-10-2006 15:18 » 

Мыло получил - ща гляну. А твой код только без Ех работает великолепно, а с Ех матюкается на число параметров. Чёт вы деушка перемудрили. Ага

* Tst2.zip (11.42 Кб - загружено 768 раз.)
« Последнее редактирование: 12-10-2006 15:21 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 12-10-2006 15:25 » 

Бррр, Ирин - тебе это срочно? А то я там без пол-банки не разберусь.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 12-10-2006 15:37 » 

Ни в коем случае!
Я сейчас еще раз сама разбираться буду! Ага
Оставь и не мучайся!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 12-10-2006 15:39 » 

Факт, что EnumRegKey функцклирует.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #9 : 12-10-2006 15:50 » 

Стоп, кажется до меня дошло - эта функция выдает имена поддиректорий, а когда забираешься в какую-то конечную директорию, где уже никаких папок - только параметры, вот тогда она, родимая, ничего и не видит и рассказывает, что никаких записей там больше нет.
Если это так, то это плачевно. Обидно...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 12-10-2006 15:57 » 

Почему? Делай рекурсию.


Код:
DWORD EnumRegXXX(HKEY hParentKey, const CString& stKeyName)
{
DWORD   dwIndex = 0;
TCHAR   pszSubKeyName[_MAX_PATH];
HKEY    hCurrentKey;
DWORD   dwResult;

if((dwResult = ::RegOpenKey(hParentKey, stKeyName, &hCurrentKey)) == ERROR_SUCCESS)
{
// itterate all subkeys
int nInd = 0;
while((dwResult = ::RegEnumKey(hCurrentKey, nInd, pszSubKeyName, _MAX_PATH-1)) == ERROR_SUCCESS)
{
CString st = pszSubKeyName;
EnumRegXXX(hCurrentKey, pszSubKeyName);
nInd++;
}

if((dwResult == ERROR_NO_MORE_ITEMS) || (dwResult == ERROR_BADKEY))
{
// itterate this keys values
TCHAR pszVal[_MAX_PATH];
BYTE pValue[4096];
int i = 0;
BOOL bStop = FALSE;
while(!bStop)
{
DWORD nType;
DWORD nNameSize = _MAX_PATH;
DWORD nValueSize = 4096;
LONG res = ::RegEnumValue(hCurrentKey, i, pszVal, &nNameSize, 0, &nType, pValue, &nValueSize);
if(ERROR_NO_MORE_ITEMS == res)
{
bStop = TRUE;
}
else
{
CString stVal = _T("");
switch(nType)
{
case REG_SZ:
case REG_EXPAND_SZ:
stVal = (TCHAR*)pValue;
break;
case REG_BINARY:
stVal = ConvertBinToStr(pValue, nValueSize);
break;
case REG_DWORD:
stVal.Format(_T("%d"), *((DWORD*)pValue));
break;
}
}
i++;
}
}
}
RegCloseKey(hCurrentKey);
return dwResult;
}

Передай в неё буфер для сбора данных или что там тебе надо и усё. Прогуляйся по ней с дебагером

зы Всё через 7 минут сваливаю
« Последнее редактирование: 12-10-2006 16:04 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #11 : 12-10-2006 16:04 » 

Джон,

сейчас попробовала - RegEnumKeyEx() функционирует не хуже, но и не лучше...
Внизу - твоя же функция, которую я дополнила вызовом RegEnumKeyEx():

Код:
void FindAllSubKeys(HKEY hKeyBase, CString csKeyPath)
{
HKEY hKey = NULL;
BOOL bRes = FALSE;

// open registry
bRes = OpenRegKey(hKeyBase, LPCTSTR(csKeyPath), hKey,
                       KEY_READ);
if (bRes == TRUE)
{
int lasterror = ERROR_SUCCESS;
int nIndex = 0;

while (lasterror == ERROR_SUCCESS || lasterror ==
                            ERROR_MORE_DATA)
{
DWORD dwName = (MAX_PATH + 1) * sizeof
                                      (TCHAR);
TCHAR chName[MAX_PATH + 1];

_tcscpy (chName, _T(""));
lasterror = ::RegEnumKey(hKey, nIndex, chName,
                                                       dwName);

TCHAR chClass[MAX_PATH + 1];
DWORD dwClass = (MAX_PATH + 1) * sizeof
                                         (TCHAR);
_tcscpy (chClass, _T(""));

FILETIME ftLastWriteTime;

lasterror = ::RegEnumKeyEx(
 hKey,          // handle to key to enumerate
 nIndex,      // index of subkey to enumerate
 chName,      // address of buffer for subkey name
 &dwName,   // address for size of subkey buffer
 NULL, // reserved
 chClass,     // address of buffer for class string
 &dwClass,  // address for size of class buffer
 &ftLastWriteTime  // address for time key last
                                                               written to
);
 
if (lasterror != ERROR_NO_MORE_ITEMS)
{
TRACE ("Name = %s \n", chName);
}
else
{
TRACE (
                                         _T("ERROR_NO_MORE_ITEMS  ..... \n"));
}

nIndex++;
}

// close registry
CloseRegKey(hKey);
}
}

Так рекурсия заканчивается на имени последней вложенной папки! А дальше - тишина и мертвые с косами стоят  Скромно так...

Т.е.:HKEY_LOCAL_MACHINE -> SOFTWARE -> MojaFirma -> MojProekt -> Opcii -> Irina - все, дальше папок нет!
В папке с именем "Irina" только параметры со значениями! Причем меня как раз они и интересовали...  Я зол!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Diletant
Помогающий

de
Offline Offline

« Ответ #12 : 20-10-2006 08:28 » 

A RegEnumValue использовать слабо? Улыбаюсь Ключи все-таки отличаются от параметров.
Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 23-10-2006 07:47 » 

Идея была, да подкачала  Да-да Т.е. проблема применения этой функции заключается в том, что тут желательно знать тип данных, а если не знаешь, а тип, например, REG_BINARY, то вместо удобоваримого значения получишь абракадабру... И к тому же хотелось все и сразу!  Отлично Ага, щас!  Я зол! Пришлось сначала применять эту функцию для определения имени параметра, а затем RegQueryMultipleValues для определения значениай в приличном виде.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines