Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перечисление значений в реестре 
V
    Опции темы
G0L1a7h
Дата 14.7.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 1.3.2008

Репутация: нет
Всего: нет



Здравствуйте! Допустил ошибку в программе, никак не найду где..
Суть программы: Перечисляет значения ключа , сравнивает с другим , если такое значение уже есть возвращаем FALSE, если нет создаем , возвращаем TRUE.. Так вот программа всегда возвращает TRUE.. Никак не найду ошибку, уже много чего пробовал...

Код


#include <windows.h>
#include <stdio.h>

BOOL CheckInReg(char *Val)
{
HKEY hKey;
char szName[ 256 ]={ 0 };
DWORD dwIndex=0,dwValue,lResCode = ERROR_SUCCESS;
RegOpenKeyEx( HKEY_LOCAL_MACHINE,"SOFTWARE\\MYPROG",NULL,KEY_ALL_ACCESS,&hKey );
while(0)
{
        szName[ 0 ] = 0;
        lResCode = RegEnumValue( hKey, dwIndex, szName, &dwValue, NULL, NULL, NULL, NULL );
        if ( lstrcmp( szName,Val ) == 0 ) 
        {    
        
            return FALSE;    
            
        }
        if ( lResCode == ERROR_NO_MORE_ITEMS )
        {
                    
            break;    
        
        }    
        
        
        dwIndex++;
}

RegSetValueEx( hKey, Val, 0, REG_SZ, NULL, NULL );
RegCloseKey( hKey );
return TRUE;
}

int main (  )
{
BOOL bRet = CheckInReg( "Value_1" );
if( bRet == TRUE )
{

    printf( "Value has not been created\n" );
    
}
    else
    {
    
        printf( "Value is already created\n" );
        
    }
return 0;
}

Надеюсь на помощь.


PM MAIL   Вверх
Rififi
Дата 14.7.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



внимательно читаем msdn про четвёртый параметр функции RegEnumValue

lpcchValueName 
A pointer to a variable that specifies the size of the buffer pointed to by the lpValueName parameter, in characters. When the function returns, the variable receives the number of characters stored in the buffer, not including the terminating null character

ps. не говоря уже о том, что при while (0) тело цикла ни разу не выполнится

Это сообщение отредактировал(а) Rififi - 14.7.2008, 23:16
PM MAIL   Вверх
G0L1a7h
Дата 15.7.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 1.3.2008

Репутация: нет
Всего: нет



Спасибо Rififi, те ошибки по исправлял, Но теперь выдает только 2 первых значения :\ Даже не знаю в чем дело..Надеюсь на помощь.

Код

#include <windows.h>
#include <stdio.h>

BOOL CheckInReg(char *Val)
{

HKEY hKey;
char szName[ 256 ];
DWORD dwIndex = 0,
dwValue = sizeof( szName ),
lResCode ;

RegOpenKeyEx( HKEY_LOCAL_MACHINE,"SOFTWARE\\MYPROG",NULL,KEY_ALL_ACCESS,&hKey );

while( 1 )
{
        ZeroMemory( szName,256 );
        lResCode = RegEnumValue( hKey, dwIndex, szName, &dwValue, NULL, NULL, NULL, NULL );
        printf("%s\n",szName);
        
        if ( lstrcmp( szName,Val ) == 0 ) 
        {    
            
            return FALSE;    
            
        }
        
        if ( lResCode == ERROR_NO_MORE_ITEMS )
        {
            RegSetValueEx( hKey, Val, 0, REG_SZ, NULL, NULL );
            RegCloseKey( hKey );        
            return TRUE;
        
        }
        
        dwIndex++;
}


}

int main (  )
{

BOOL bRet = CheckInReg( "qwe" );
if( bRet == TRUE )
{

    printf( "Value has not been created\n" );
    
}
    else
    {
    
        printf( "Value is already created\n" );
        
    }
return 0;
}




Это сообщение отредактировал(а) G0L1a7h - 15.7.2008, 14:10
PM MAIL   Вверх
Rififi
Дата 15.7.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



у тебя размер буфера, передаваемый параметром dwValue уменьшается с каждым вызовом!
вот его и хватает только на 2 раза.
Объясняю: вначале тыпередаешь указатель на буфер и укзатель на размер буфера. Если буфер слишком маленький для результата, то функция вернёт ошибку ERROR_MORE_DATA.
если рамер буфера достаточен, то функция заполняет буфер и перезаписывает в dwValue новый размер буфера. Для следующего цикла итерации в функцию снова нужно передать первоначальный размер.
PM MAIL   Вверх
G0L1a7h
Дата 15.7.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 1.3.2008

Репутация: нет
Всего: нет



Rififi , Большое Спасибо за помощь! (:
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.