【【【 用CRegKey::QueryValue连续读取注册表的问题,谢谢 】】】

lj9852 2002-05-21 02:35:18
从注册表中读取指定的值:
char strDSN[20];
char strPwd[20];
char strUserID[20];
DWORD count=20;
CRegKey regkey;
regkey.Open(HKEY_CURRENT_USER,"software\\sysvalue\\datasource");
regkey.QueryValue(strDSN,"name",&count);
regkey.QueryValue(strPwd,"password",&count);
regkey.QueryValue(strUserID,"LastUser",&count);

得到的结果前两个正确,最后一个是乱码,而且读取顺序不同结果也不同,怎么会这样?是不是m_hKey在搞鬼?
...全文
400 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqedsaa1 2002-08-15
  • 打赏
  • 举报
回复
我也是,怎么回事说说
lj9852 2002-05-21
  • 打赏
  • 举报
回复
谢谢,实在不行只能用api了,但为什么用CRegKey不行呢,读单个键值都没问题的,就是连续读会出问题
lj9852 2002-05-21
  • 打赏
  • 举报
回复
解决了,我kao,忘了重新赋值
lj9852 2002-05-21
  • 打赏
  • 举报
回复
不用类,用api也一样的问题
alphapaopao 2002-05-21
  • 打赏
  • 举报
回复
那个类,我没用过
lj9852 2002-05-21
  • 打赏
  • 举报
回复
我再up
flaginwind 2002-05-21
  • 打赏
  • 举报
回复
简单看了一下,我想可能是QueryValue函数有问题,这种方式重载的QueryValue也许有很多限制。做了一下试验,当字符不大于3个的时候是正常结果。当大于3个时,函数返回值为234,此错误为More data is available.
没有得出结论为什么会这样。建议使用RegQueryValueEx函数。
以下有一个例子:
HKEY hkRoot;
CString pwd;
long lResult;
unsigned char * pch = new BYTE[80];
DWORD type_1 = REG_SZ;
DWORD cbData_1=80;
lResult = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"software\\Taiji\\fiu",
0,
KEY_ALL_ACCESS,
&hkRoot
);
if(lResult!=ERROR_SUCCESS)
{
//错误处理,退出
}
lResult = RegQueryValueEx(
hkRoot,
"SYSPWD",
NULL,
&type_1,
pch,
&cbData_1);
if(lResult != ERROR_SUCCESS)
{
}
pwd.Format("%s",pch);
qhq800 2002-05-21
  • 打赏
  • 举报
回复
up
lj9852 2002-05-21
  • 打赏
  • 举报
回复
真的啊,顺序改变的话结果都不一样:

HKEY hkRoot;
long lResult;
unsigned char * pch = new BYTE[80];
DWORD type_1 = REG_SZ;
DWORD cbData_1=80;
lResult = RegOpenKeyEx(
HKEY_CURRENT_USER,
"software\\sysvalue\\datasource",
0,
KEY_EXECUTE,
&hkRoot
);

unsigned char * strDSN = new BYTE[80];
unsigned char * strServer = new BYTE[80];
unsigned char * strUserID = new BYTE[80];

lResult=RegQueryValueEx(
hkRoot,
"name",
NULL,
&type_1,
strDSN,
&cbData_1);
if(lResult != ERROR_SUCCESS)
{
MessageBox(NULL,"name","sf",MB_ICONERROR);
}

lResult = RegQueryValueEx(
hkRoot,
"IsChange",
NULL,
&type_1,
pch,
&cbData_1);

MessageBox(NULL,CString(pch),"sf",MB_OK);

lResult=RegQueryValueEx(
hkRoot,
"Server",
NULL,
&type_1,
strServer,
&cbData_1);
if(lResult != ERROR_SUCCESS)
{
MessageBox(NULL,"Server","sf",MB_ICONERROR);
}


lResult=RegQueryValueEx(
hkRoot,
"LastUser",
NULL,
&type_1,
strUserID,
&cbData_1);
if(lResult != ERROR_SUCCESS)
{
MessageBox(NULL,"LastUser","sf",MB_ICONERROR);
}
x_rong 2002-05-21
  • 打赏
  • 举报
回复
关注!
smallwei 2002-05-21
  • 打赏
  • 举报
回复
ret0 = RegQueryValueEx(hKey,m_Value_Name,NULL,NULL,m_Value,&length);

我用此函数连续读了五次都没有问题啊!
lj9852 2002-05-21
  • 打赏
  • 举报
回复
没人知道么?
lj9852 2002-05-21
  • 打赏
  • 举报
回复
见鬼了,用RegQueryValueEx也是一样,比如连续四次调用RegQueryValueEx读取四个键值,只有当语句按一定顺序调用时结果才都正确,而这个顺序又跟注册表中键值的排列顺序无关,急啊,谁知道怎么回事?

16,472

社区成员

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

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

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