Malaja
|
|
« : 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++ »
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #2 : 12-10-2006 14:21 » |
|
Джон, солнышко,
почему нормально??? Винда = xp, проект = unicode, студия = 6SP6.
По общей логике вещей RegEnumKey() и RegEnumValue() должны работать по сходной схеме. Тем не менее этого не наблюдается...
Проблема возникла по следующему поводу: в проекте уже есть папка в реестре, в которой сохраняют определенные настройки. Мне надо загнать туда свою папочку (т.е. subdirectory), в которой у меня будут сохраняться некоторые данные. Все это должно быть сделано так, чтобы можно было считывать из реестра всю инфу, зная только основной путь + имя моей папки (и не зная типов данных и имен параметров). Вот я и захотела использовать RegEnumKey(), чтобы считать имена всех параметров, потом с помощью RegQueryMultipleValues() выяснить тип каждого параметра и потом с помощью RegEnumValue() или RegQueryValueEx() считать его значение. Итого - идея проста, как чайник со свистком, но мелочи не дают радоваться жизни ;-(
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 12-10-2006 14:23 » |
|
замени 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
|
|
« Ответ #4 : 12-10-2006 15:09 » |
|
Фигушки! От перемены мест слагаемых сумма не меняется! Т.е. ничегошеньки не работает Но я все равно радуюсь Ага, хорошо, я тут тоже сегодня до 7 вечера как минимум. После 6 позвоню. Майл отправила.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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."
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #7 : 12-10-2006 15:37 » |
|
Ни в коем случае! Я сейчас еще раз сама разбираться буду! Оставь и не мучайся!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #9 : 12-10-2006 15:50 » |
|
Стоп, кажется до меня дошло - эта функция выдает имена поддиректорий, а когда забираешься в какую-то конечную директорию, где уже никаких папок - только параметры, вот тогда она, родимая, ничего и не видит и рассказывает, что никаких записей там больше нет. Если это так, то это плачевно. Обидно...
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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
|
|
« Ответ #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
Помогающий
Offline
|
|
« Ответ #12 : 20-10-2006 08:28 » |
|
A RegEnumValue использовать слабо? Ключи все-таки отличаются от параметров.
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #13 : 23-10-2006 07:47 » |
|
Идея была, да подкачала Т.е. проблема применения этой функции заключается в том, что тут желательно знать тип данных, а если не знаешь, а тип, например, REG_BINARY, то вместо удобоваримого значения получишь абракадабру... И к тому же хотелось все и сразу! Ага, щас! Пришлось сначала применять эту функцию для определения имени параметра, а затем RegQueryMultipleValues для определения значениай в приличном виде.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|