Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Реестр : RegEnumValue


Автор: JJohn 19.11.2005, 00:44
Есть код:
Цитата

LONG Err2;
  int index=0;
  char ValueName[MAX_PATH], Value[MAX_PATH];;
  DWORD ValueNameSize, tip, ValueSize;

while (1)
    {
    ValueNameSize=MAX_PATH;
  Err2=RegEnumValue(hk,index,&ValueName[0],&ValueNameSize,NULL,&tip,&Value[0],&ValueSize);
    if (Err2==ERROR_NO_MORE_ITEMS) break;
    ...
    }


так вот..... ранее создал ключ с тремя значениями... когда начинаю читать их, одно читается неправильно... почему???
что самое странное, не читается только одно с типом REG_SZ (там строчка из 5 слов), а regedit выводит все правильно...

p.s.> вывожу ее напрямую, например memo1->Lines->Add(ValueName); тоже значение показывает и DEBUG при наведении на ValueName

Автор: JoyEx 19.11.2005, 04:00
я smile не уверен, но может быть еще нужно инициализировать ValueNameSize и ValueSize

Автор: JJohn 19.11.2005, 12:44
JoyEx
ты не уверен , но ты прав!!!:)

Благодарю за совет)

добавил в цикл ValueSize=MAX_PATH; и все заработало

Автор: ORUM 19.10.2009, 21:42
Доброго времини суток) Если ВЫ не против я продолжу эту тему.
У меня проблема. Нужно вывести параметрии ключа реестра(имя параметра, тип данных, и данные). Функцыя работаэт через раз, и то выводит токо имя, и даже не все((
Подскажите, что не так. Спасиб))
Код


 char lpValueName[255];
  DWORD lpcValueName;
  DWORD lpType;
  LPBYTE lpData;
  DWORD lpcbData;
/**************************/

if(ERROR_SUCCESS==RegQueryInfoKey(hKey3v,cClass,&dwSize,NULL,&dwSubKeys,&dwMaxLength,
&dwMaxClass,
&dwValues,
&dwMaxValue,
&dwMaxData,
&dwSec,
&ftFileTime))

lpcValueName=dwMaxValue;//размер имени=мах размер
lpcbData=dwMaxData;//размер данных=махРазмер

for(i = 0;i<(int)dwValues; i++)
{ 

if(ERROR_SUCCESS==RegEnumValue(hKey3v, (int) i,&lpValueName[0], &lpcValueName,0,&lpType,&lpData[0],&lpcbData))

                                                            
switch ((int)i)
{ 
  case 0:
SetWindowText(hEdit1,(char*)&lpValueName);//вывод инфы
SetWindowText(hEdit2,(char*)&lpType);
SetWindowText(hEdit3,(char*)&lpData);
break; 
  
case 1:
SetWindowText(hEdit4,lpValueName); 
.............

Автор: mekhanikus 20.10.2009, 11:57
Код

if(ERROR_SUCCESS==RegEnumValue(hKey3v,
(int) i,
lpValueName, //это - уже адрес буфера
&lpcValueName, //выставлять по максимуму после каждого Enum
0,
&lpType,
lpData, //это - уже адрес буфера
&lpcbData)) //выставлять по максимуму после каждого Enum


Код

SetWindowText(hEdit1,lpValueName); //текст так вывести получится
SetWindowText(hEdit2,(char*)&lpType); //а вот DWORD придется сперва в строку преобразовать. Например с помощью wsprintf
SetWindowText(hEdit3,(char*)&lpData);

Автор: ORUM 20.10.2009, 21:10
mekhanikus- спасиб.

мой програм код теперь:
Код

 char lpValueName[255];//имя
  DWORD lpcValueName;//размер имени
  DWORD lpType;//тип
  LPBYTE lpData;//данные
  DWORD lpcbData;//размер их
/************/

for(i = 0;i<(int)dwValues; i++)
{
lpcValueName=dwMaxValue;//размер имени=максиммальному размеру
lpcbData=dwMaxData;//размер данных=махРазмер даних

if(ERROR_SUCCESS==RegEnumValue(hKey3v, (int) i, lpValueName, &lpcValueName,0, &lpType, lpData, &lpcbData))


switch ((int)i)
{  
 case 0:
SetWindowText(hEdit1,lpValueName);//вывод имени
break;


всеравно не все ключи читает((.  Мне хотя бы все имена вывести,

Автор: mekhanikus 21.10.2009, 13:37
Сделай так:
Код

while(ERROR_NO_MORE_ITEMS != RegEnumValue(hKey3v, (int) i, lpValueName, &lpcValueName,0, &lpType, lpData, &lpcbData))

Не забывай инкремировать i.

А тут ты запутался:
Код

lpcValueName=255; // здесь размер буфера lpValueName
lpcbData=???;// а здесь размер буфера lpData

Причем указатель lpData надо бы инициализировать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)