RegEnumValue和reg_binary的问题

nokia007 2009-07-12 02:20:04
用regenumvalue读取一个reg_binary值,这个值非常长,好几K字节,但我只需要第20和第22个字节,怎样才能高效率地提取这两个字节?
...全文
115 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gg606 2009-07-12
  • 打赏
  • 举报
回复
接着呢,TKS ^_^
nokia007 2009-07-12
  • 打赏
  • 举报
回复

谢谢,结贴。
gg606 2009-07-12
  • 打赏
  • 举报
回复
RegEnumValue可以获得值,没错。

常用的方法应该是用new,因为一般来说,你事先并不知道数据长度。
如果你确定数据为1500字节,当然也可以那样用喽。
nokia007 2009-07-12
  • 打赏
  • 举报
回复
我是这样定义的:
BYTE data[1500];
DWORD dataSize=1500;
没有动态分配内存。应该也可以吧?
RegEnumValue可以获得值的,第七个和第八个参数就是,好像不必再RegQueryValueEx

gg606 2009-07-12
  • 打赏
  • 举报
回复

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++;
}

我插入的怎么还这么乱?
gg606 2009-07-12
  • 打赏
  • 举报
回复
试试看


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++;
}
nokia007 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gg606 的回复:]
你这段代码只是看哪些项是二进制啊!并没有实际读取数据呀!
我帮你看看哈。
也向你请教一下,怎样才能保持代码里的TAB缩进呢?
[/Quote]
是啊,我不知道应该怎样定义第六个和第七个参数(定义成什么类型的,多大),暂时以NULL代替了.
你是指复制代码到发帖框子的缩进吗?使用"插入源代码"功能就可以保持了.
gg606 2009-07-12
  • 打赏
  • 举报
回复
你这段代码只是看哪些项是二进制啊!并没有实际读取数据呀!
我帮你看看哈。
也向你请教一下,怎样才能保持代码里的TAB缩进呢?
nokia007 2009-07-12
  • 打赏
  • 举报
回复
是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)一样重新赋予初值?
gg606 2009-07-12
  • 打赏
  • 举报
回复
应该是用RegQueryValueEx读吧?
只能全读出来,全读出来也没有多大开销。
oyljerry 2009-07-12
  • 打赏
  • 举报
回复
应该要全部读取出来,然后自己截取...

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧