Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с реестром (RegEnumValue) 
:(
    Опции темы
volery
  Дата 3.1.2013, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Программа выводит в консоле типы и значения которые хранятся в реестре.
Как не пытаюсь либо ошибка либо выводит что то не то или ошибок нету но и ничего не выводит...
Подскажите как правильно задать lpType и lpDate что бы они выводились рядом в столбик вот часть программы где это нужно задать:

Код

   LONG lResCode;
    LONG root;
    char path[128];
    DWORD dwValue = 256;
    DWORD dwIndex = 0;
    char szName[256];
    HKEY hKey;
    LONG lstatus;
    instructions()
{
            dwValue = 256;
 
            
            lstatus = RegEnumValue(hKey,dwIndex,szName,&dwValue,NULL,NULL,NULL,NULL);
            if (lstatus == ERROR_SUCCESS)
            {
                cout <<szName<<endl;
 
            }



А вот вся программа :

Код

#include "stdafx.h"
#undef UNICODE
#include<windows.h>
#include<iostream>
#include<iomanip>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<deque>
#include<string>
 
using namespace std;
 
void instructions(void);
HKEY openkey(LONG, char *);
 
void main()
{
    LONG lResCode;
    LONG root;
    char path[128];
    DWORD dwValue = 256;
    DWORD dwIndex = 0;
    char szName[256];
    HKEY hKey;
    LONG lstatus;
    instructions();
    cout << endl << "Enter: ";
    cin >> root;
 
    while (root < 0 || root > 6) 
    {
        cout << "Invalid value." << endl << endl;
        instructions();
        cout << endl << "Enter: ";
        cin >> root;
    }   
 
    cout << endl << "Enter key: ";
    cin >> path;
    cout<<endl;
 
    hKey = openkey(root, path);
        cout<<"Keys: "<< endl << endl;
        do
        {
            dwValue = 256;
 
            
            lstatus = RegEnumValue(hKey,dwIndex,szName,&dwValue,NULL,NULL,NULL,NULL);
            if (lstatus == ERROR_SUCCESS)
            {
                cout <<szName<<endl;
 
            }
                            
            dwIndex++;
 
        }
        while(lstatus != ERROR_NO_MORE_ITEMS);
        
    RegCloseKey(hKey);
    getchar();
    getchar();
}
 
void instructions() 
{
        cout <<
        "To select HKEY_CLASSES_ROOT enter 1" << endl <<
        "To select HKEY_CURRENT_CONFIG enter 2" << endl <<
        "To select HKEY_CURRENT_USER enter 3" << endl <<
        "To select HKEY_LOCAL_MACHINE enter 4" << endl <<
        "To select HKEY_USERS enter 5" << endl;
}
 
HKEY openkey(LONG root, char *path) 
{
    HKEY hKey;
    LONG lstatus;   
    
    switch(root) {
        case 1: 
            lstatus = RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT(path), 0, KEY_READ, &hKey);
            break;
        case 2: 
            lstatus = RegOpenKeyEx(HKEY_CURRENT_CONFIG, TEXT(path), 0, KEY_READ, &hKey);
            break;
        case 3: 
            lstatus = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT(path), 0, KEY_READ, &hKey);
            break;
        case 4: 
            lstatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(path), 0, KEY_READ, &hKey);
            break;
        case 5: 
            lstatus = RegOpenKeyEx(HKEY_USERS, TEXT(path), 0, KEY_READ, &hKey);
            break;
    }
    
    if (lstatus != ERROR_SUCCESS) 
    {
        cout << "Could not access register (error " << GetLastError() << ")" << endl;
        getchar();
        exit(1);
    }
    return hKey;
}

PM MAIL   Вверх
feodorv
Дата 3.1.2013, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(volery @  3.1.2013,  15:06 Найти цитируемый пост)
Подскажите как правильно задать lpType и lpDate что бы они выводились рядом в столбик

Я бы тупо завёл буфер (на один килобайт, к примеру), и отправлял бы его в качестве lpData. И уже в зависимости от значения lpType, возвращаемого RegEnumValue, интерпретировал бы данные в lpData:
  • REG_BINARY - просто поток байт, вывод в 16-ричном виде
  • REG_DWORD - значит lpData можно рассматривать как указатель на DWORD
    Код
    DWORD dvalue = *(DWORD *) lpData;
    wsprintf( outputValue, "%u", dvalue);
  • REG_DWORD_LITTLE_ENDIAN - аналогично REG_DWORD, но с преобразованием из LITTLE ENDIAN
  • REG_DWORD_BIG_ENDIAN - аналогично REG_DWORD, но с преобразованием из BIG ENDIAN
  • REG_EXPAND_SZ - просто строка, но можно с ней поколдовать
  • REG_MULTI_SZ - список строк в формате "string1\0string2\0...stringN\0\0"
  • REG_NONE - стоит проигнорировать значение
  • REG_QWORD - 64-х битное значение (обработка аналогично REG_QWORD)
  • REG_QWORD_LITTLE_ENDIAN - то же, так же
  • и т.д.
См. сюдасюда etc

То есть lpType заранее не задаётся, а как раз её значение получается из функции RegEnumValue. Осталось только это значение преобразовать в строчку:
Код

const char *get_type_name( DWORD type )
{
  switch( type )
  {
    case REG_BINARY:   return "REG_BINARY";
    case REG_DWORD:  return "REG_DWORD";
    ....
    default: return "(unknown)";
  }
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volery
Дата 3.1.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как то Имена было проще вывести. А это не получается или не так что то понял...
PM MAIL   Вверх
feodorv
Дата 3.1.2013, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(volery @  3.1.2013,  18:40 Найти цитируемый пост)
Как то Имена было проще вывести.

В смысле, вот это вот:
Цитата(volery @  3.1.2013,  15:06 Найти цитируемый пост)
                cout <<szName<<endl;

??? Ну, а чего здесь сложного-то? А с типом и значением придётся повозиться...

Если
Код
void print_value( const char *name, DWORD type, BYTE *value, DWORD length)
{
  DWORD i;

  printf( "%-20s  %-20s  ", name, get_type_name( type ));

  switch( type )
  {
    default:
    case REG_BINARY:
      for( i = 0; i < length; i++) printf( "%.2x", value[i]);
      break;
    case REG_DWORD:
      printf( "%u", *(DWORD *) value);
      break;
    ....
    case REG_SZ:
      printf( "%s", value);
      break;
  }

  printf( "\n" );
}


Тогда:
Код
  for( ;; )
  {
     DWORD type, length;
     BYTE data[1024];

     dwValue = 256;
     length = sizeof(data);
     lstatus = RegEnumValue( hKey, dwIndex, szName, &dwValue, NULL, &type, data, &length);

     if( lstatus == ERROR_SUCCESS )
     {
       print_value( szName, type, data, length);
       continue;
     }

     if( lstatus != ERROR_NO_MORE_ITEMS ) /* Error */;
     break;
  }


Только переделайте под C++ smile 

Это сообщение отредактировал(а) feodorv - 3.1.2013, 19:30


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volery
Дата 3.1.2013, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Буду дальше голову ломать
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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