PDA

Просмотр полной версии : Проблема с отображением записей реестра


_nic
30.03.2009, 19:24
Вот пара сишных ф-ций

char* regtp(DWORD tp)
{
if(tp==REG_BINARY){return("REG_BINARY");}
if(tp==REG_DWORD){return("REG_DWORD");}
if(tp==REG_DWORD_LITTLE_ENDIAN){return("REG_DWORD_LITTLE_ENDIAN");}
if(tp==REG_DWORD_BIG_ENDIAN){return("REG_DWORD_BIG_ENDIAN");}
if(tp==REG_EXPAND_SZ){return("REG_EXPAND_SZ");}
if(tp==REG_LINK){return("REG_LINK(reserved for system)");}
if(tp==REG_MULTI_SZ){return("REG_MULTI_SZ");}
if(tp==REG_NONE){return("REG_NONE");}
if(tp==REG_QWORD){return("REG_QWORD");}
if(tp==REG_QWORD_LITTLE_ENDIAN){return("REG_QWORD_LITTLE_ENDIAN");}
if(tp==REG_SZ){return("REG_SZ");}
}
char* lsreg(HKEY ink,char subk[1024])
{
char *buf=new char[1024*1024];
char *kname=new char[1204*10];
char *buff=new char[1024*10];
memset(buf,NULL,1024*1024);
long retk,retd;DWORD len,maxlen;
HKEY key;DWORD keyind=0,datind=0;
char Name[MAX_PATH], Value[MAX_PATH];;
DWORD NameSize,tip,ValueSize;
if(RegOpenKeyEx(ink,subk,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
{
RegQueryInfoKey(key,0,0,0,0,&maxlen,0,0,0,0,0,0);
//maxlen++;
for(;;)
{
len=maxlen;
memset(kname,NULL,1024*10);
retk=RegEnumKeyEx(key,keyind,kname,&len,0,0,0,0);
wsprintf(buff,"%s\n",kname);
strcat(buf,buff);
keyind++;
if(retk==ERROR_NO_MORE_ITEMS){break;}
}
}//buf+=4;
for(;;)
{
NameSize=MAX_PATH;
retd=RegEnumValue(key,datind++,&Name[0],&NameSize,NULL,&tip,(unsigned char*)&Value[0],&ValueSize);
wsprintf(buff,"%s %s\n",Name,/*(DWORD*)Value,*/regtp(tip));
strcat(buf,buff);
if(retd==ERROR_NO_MORE_ITEMS){break;}
tip=0;
}
return(buf);
}

Ппроблема в том что обкусываются последние буквы имен некоторых разделов и записей.Причем обкусывается как то рандомно.Помогите пжлст найти косяк.

KaZ@NoVa
30.03.2009, 19:49
Так просто и не скажешь, где косяк. Нужен отладчик, надо увидеть на каком шаге.

slesh
30.03.2009, 19:55
Максимальный размер не правильно даешь.
Вместо len=maxlen; поставь len=1000;

ошибку тут

RegQueryInfoKey(key,0,0,0,0,&maxlen,0,0,0,0,0,0);
//maxlen++;
for(;;)
{
len=maxlen;
memset(kname,NULL,1024*10);
retk=RegEnumKeyEx(key,keyind,kname,&len,0,0,0,0);

судя по виду RegQueryInfoKey(key,0,0,0,0,&maxlen,0,0,0,0,0,0); обламывается или дает не верный результат. Или в этом редультате значение чуть несчитая завершающий символ 0x00
по этмоу len содержит не правильный размер.
т.к. ты игнориш это значение и выделяешь фиксировано память через memset(kname,NULL,1024*10);
то и присвой len=1024*10 вместо len=maxlen;

_nic
31.03.2009, 02:02
Максимальный размер не правильно даешь.
Вместо len=maxlen; поставь len=1000;

ошибку тут

RegQueryInfoKey(key,0,0,0,0,&maxlen,0,0,0,0,0,0);
//maxlen++;
for(;;)
{
len=maxlen;
memset(kname,NULL,1024*10);
retk=RegEnumKeyEx(key,keyind,kname,&len,0,0,0,0);

судя по виду RegQueryInfoKey(key,0,0,0,0,&maxlen,0,0,0,0,0,0); обламывается или дает не верный результат. Или в этом редультате значение чуть несчитая завершающий символ 0x00
по этмоу len содержит не правильный размер.
т.к. ты игнориш это значение и выделяешь фиксировано память через memset(kname,NULL,1024*10);
то и присвой len=1024*10 вместо len=maxlen;
Хм да причина в этом.Только вот теперь вылез ещё один баг.При вызове в последнем цикле wsprintf пtреодически и неожиданно выскакивает Eaccess Violation :confused: