用regenumvalue读取一个reg_binary值,这个值非常长,好几K字节,但我只需要第20和第22个字节,怎样才能高效率地提取这两个字节?

解决方案 »

  1.   

    应该是用RegQueryValueEx读吧?
    只能全读出来,全读出来也没有多大开销。
      

  2.   

    是RegEnumValue的,是枚举很多一样结构的键值。
    MSDN上这样说:
    Registry value names are limited to 32767 bytes. The ANSI version of this function treats this param as a USHORT value. Therefore, if you specify a value greater than 32767 bytes, there is an overflow and the function may return ERROR_MORE_DATA.TCHAR Value[255];
    DWORD dwSize=255;
    DWORD dIndex=0;
    DWORD dwType=0; while(RegEnumValue(hkey,dIndex,Value,&dwSize,NULL,&dwType,NULL,NULL)==ERROR_SUCCESS)
    {
    static int line = 0;
    if(dwType == REG_BINARY)
    {
    line++;
    }
    dwSize=255;//注释1
    dIndex++;
    }我要读取的reg_binary值有1500字节,那么unicode程序中应该怎样定义regenumvalue最后两个参数?另外,每次循环中,第7个参数lpcbData 是不是也要像第四个参数lpcchValueName (注释1)一样重新赋予初值?
      

  3.   

    你这段代码只是看哪些项是二进制啊!并没有实际读取数据呀!
    我帮你看看哈。
    也向你请教一下,怎样才能保持代码里的TAB缩进呢?
      

  4.   

    是啊,我不知道应该怎样定义第六个和第七个参数(定义成什么类型的,多大),暂时以NULL代替了.
    你是指复制代码到发帖框子的缩进吗?使用"插入源代码"功能就可以保持了.
      

  5.   

    试试看
    TCHAR ValueName[255];
            DWORD dwValueNameSize=255;
            DWORD dwIndex=0;
            DWORD dwType=0;
    BYTE * pData;
    DWORD dwDataSize = 0;        while(ERROR_SUCCESS == RegEnumValue(hkey,dwIndex,
    ValueName,&dwValueNameSize,NULL,&dwType,NULL,&dwDataSize)) // 查询值的类型和数据字节数
            {
                static int line = 0;
                if(dwType == REG_BINARY)
                {
                    line++;
    pData = new BYTE[dwDataSize];
    LONG lResult = RegQueryValueEx(hKey,ValueName,NULL,&dwType,pData,&dwDataSize);
    if(ERROR_SUCCESS == lResult)
    {
    // 取你要的数据
    }
    delete [] pData;
    dwDataSize = 0;
                }
                dwValueNameSize=255;//注释1
                dwIndex++;
            }
      

  6.   


    TCHAR ValueName[255];
            DWORD dwValueNameSize=255;
            DWORD dwIndex=0;
            DWORD dwType=0;
    BYTE * pData;
    DWORD dwDataSize = 0;        while(ERROR_SUCCESS == RegEnumValue(hkey,dwIndex,
    ValueName,&dwValueNameSize,NULL,&dwType,NULL,&dwDataSize)) // 查询值的类型和数据字节数
            {
                static int line = 0;
                if(dwType == REG_BINARY)
                {
                    line++;
    pData = new BYTE[dwDataSize];
    LONG lResult = RegQueryValueEx(hKey,ValueName,NULL,&dwType,pData,&dwDataSize);
    if(ERROR_SUCCESS == lResult)
    {
    // 取你要的数据
    }
    delete [] pData;
    dwDataSize = 0;
                }
                dwValueNameSize=255;//注释1
                dwIndex++;
            }我插入的怎么还这么乱?
      

  7.   

    我是这样定义的:
    BYTE data[1500];
    DWORD dataSize=1500;
    没有动态分配内存。应该也可以吧?
    RegEnumValue可以获得值的,第七个和第八个参数就是,好像不必再RegQueryValueEx
      

  8.   

    RegEnumValue可以获得值,没错。常用的方法应该是用new,因为一般来说,你事先并不知道数据长度。
    如果你确定数据为1500字节,当然也可以那样用喽。