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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 30 Mar 2009.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Вот пара сишных ф-ций
    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);
    }
    
    Ппроблема в том что обкусываются последние буквы имен некоторых разделов и записей.Причем обкусывается как то рандомно.Помогите пжлст найти косяк.
     
  2. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Так просто и не скажешь, где косяк. Нужен отладчик, надо увидеть на каком шаге.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Максимальный размер не правильно даешь.
    Вместо 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;
     
    #3 slesh, 30 Mar 2009
    Last edited: 30 Mar 2009
    1 person likes this.
  4. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Хм да причина в этом.Только вот теперь вылез ещё один баг.При вызове в последнем цикле wsprintf пtреодически и неожиданно выскакивает Eaccess Violation :confused: