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

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

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

« : 13-04-2008 19:42 » 

Доброе время суток- я опять в замешательстве.
Код:
void Fill_KeyValue(HKEY hKey_FillValue)
{
char ValueName[255];
DWORD szValueName,Type,szData;
BYTE Data;
LONG ReturnValue;
memset(ValueName,0,256);

for(int i=0,u=0;i<5 && !u;i++)
{
if(RegEnumValue(hKey_FillValue,i,ValueName,&szValueName,NULL,&Type,&Data,&szData)==ERROR_SUCCESS)
MessageBox(NULL,ValueName,ValueName,0);
else if(RegEnumValue(hKey_FillValue,i,ValueName,&szValueName,NULL,&Type,&Data,&szData)==ERROR_NO_MORE_ITEMS) u++;
}
}

Функция записывает в ValueName- имя переменной ключа с i-м индексом, размер имени, идентификатор типа, значение, размер значения.
Проблема в том, что в случае вызова функции
Код:
RegEnumValue(hKey_FillValue,i,ValueName,&szValueName,NULL,&Type,&Data,&szData)
в цикле, то на экран выводится только 1 окно с именем первой переменной и всё.

Другими словами если вызывать функцию без цикла, с явным значением индекса( например RegEnumValue(hKey_FillValue,3...)), то выводится окно с именем 3-ей переменной ключа, а в цикле- нет.

2Как я понимаю,- не происходит перезапись переменных или их надо как-то обнулять каждую итерацию
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #1 : 13-04-2008 21:09 » 

memset(ValueName,0,256); //??? -> "// memset(ValueName,0,256);"

for ...

ValueName[0]=0;
szValueName=sizeof(ValueName);

RegEnum...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #2 : 14-04-2008 03:48 » 

FallenSoul, статический массив лучше очищать так

memset(ValueName,0,sizeof(ValueName));

а то ты сейчас, например, захватил младший байт переменной szValueName

Записан

Вад
Модератор

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

« Ответ #3 : 14-04-2008 03:56 » 

Другими словами если вызывать функцию без цикла, с явным значением индекса( например RegEnumValue(hKey_FillValue,3...)), то выводится окно с именем 3-ей переменной ключа, а в цикле- нет.
Без цикла - в смысле, скопировать код 5 раз и вызвать? Что даёт трассировка цикла - по какому условию выходит?
Записан
FallenSoul
Опытный

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

« Ответ #4 : 14-04-2008 06:22 » 

Код:
RegEnumValue(hKey_FillValue,i,ValueName,&szValueName,NULL,&Type,&Data,&szData)

Функция заполняет поля данными i-ой переменной ключа, хендл которого передается первым параметром.

Error_Success- удачно
Error_no_more_items- больше значений ключа нет

Выход при Error_no_more_item.

Поидее в цикле должны быть выведены 5 окон с именами значений в ключе, но выводится только 1 и на выход. Другими словами,- не видит 4 других значения.

Однако если вызывать функцию без цикла с явным индексом (2,3,4...) то выводит окна с именами соотв знач. ключа. (В одиночном вызове функции)
Записан
zubr
Гость
« Ответ #5 : 14-04-2008 06:34 » 

Цитата
hKey
[in] Handle to an open key. The key must have been opened with the KEY_QUERY_VALUE  access right. For more information, see Registry Key Security and Access Rights.
MSDN
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #6 : 14-04-2008 06:34 » 

FallenSoul, ты делаеш:

Код:
for(int u=0; !u ; )
{
 u++;
}

угадай, сколько раз выполнится цикл ? )
Записан

Вад
Модератор

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

« Ответ #7 : 14-04-2008 06:40 » 

Алексей1153++, я понимаю, так и задумано, чтобы цикл после ошибки ERROR_NO_MORE_ITEMS завершался Улыбаюсь Правда, использование логического типа было бы нагляднее Улыбаюсь
Записан
Вад
Модератор

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

« Ответ #8 : 14-04-2008 06:44 » 

Цитата: MSDN
LONG RegEnumValue(
  HKEY hKey,
  DWORD dwIndex,
  LPTSTR lpValueName,
  LPDWORD lpcValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE lpData,
  LPDWORD lpcbData
);

Parameters
...
lpcbData
[in, out] Pointer to a variable that specifies the size of the buffer pointed to by the lpData parameter, in bytes. When the function returns, the variable pointed to by the lpcbData parameter contains the number of bytes stored in the buffer.
This parameter can be NULL only if lpData is NULL.

If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, this size includes any terminating null character or characters. For more information, see Remarks.

If the buffer specified by lpData is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of lpData are undefined.

Registry value names are limited to 32767 bytes. The ANSI version of this function treats this param as a USHORT value. Therefore, if you specify a value greater than 32767 bytes, there is an overflow and the function may return ERROR_MORE_DATA.
В связи с этим не увидел, где инициализируется передаваемый по указателю DWORD szData. Можно ошибку огрести, тогда разумеется ничего не выведет - у тебя такой ветки для обработки ERROR_MORE_DATA нет.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #9 : 14-04-2008 06:48 » 

не, ну если после ошибки выйти надо, то проще так
Код:
for(; ; )
{
  if(error)break;
}
Записан

FallenSoul
Опытный

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

« Ответ #10 : 14-04-2008 17:35 » 

Инет упал- с кпк сложно писать...

в общем сделал switch на возвр. значения от функции-оказалось что если 10 значений у ключа, то ф-ция проводит 10ть иттераций, в 2х из кот.-сообщение ЕРРОР_САКСЕС, 7 _ДАТА, и последнее-кончились значения. *DONT_KNOW*

Как бы не пытался обнулять, выделять память переменных кот. передаю в функцию- без толку =\
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #11 : 14-04-2008 22:29 » 

while (?)
{
 Читаем MSDN;
 Пишем;
 Тестируем;
}

* RegEnum.rar (2 Кб - загружено 1063 раз.)
« Последнее редактирование: 15-04-2008 09:04 от v2 » Записан
FallenSoul
Опытный

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

« Ответ #12 : 15-04-2008 19:30 » new

while (?)
{
 Читаем MSDN;
 Пишем;
 Тестируем;
}


Всё перевёл на свой лад- спасибО, работает!
« Последнее редактирование: 15-04-2008 19:33 от FallenSoul » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines