Вот пара сишных ф-ций Code: 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); } Ппроблема в том что обкусываются последние буквы имен некоторых разделов и записей.Причем обкусывается как то рандомно.Помогите пжлст найти косяк.
Максимальный размер не правильно даешь. Вместо len=maxlen; поставь len=1000; ошибку тут Code: 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