从注册表中读取指定的值:
         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在搞鬼?

解决方案 »

  1.   

    简单看了一下,我想可能是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);
      

  2.   

    谢谢,实在不行只能用api了,但为什么用CRegKey不行呢,读单个键值都没问题的,就是连续读会出问题
      

  3.   

    见鬼了,用RegQueryValueEx也是一样,比如连续四次调用RegQueryValueEx读取四个键值,只有当语句按一定顺序调用时结果才都正确,而这个顺序又跟注册表中键值的排列顺序无关,急啊,谁知道怎么回事?
      

  4.   

    ret0 = RegQueryValueEx(hKey,m_Value_Name,NULL,NULL,m_Value,&length);我用此函数连续读了五次都没有问题啊!
      

  5.   

    真的啊,顺序改变的话结果都不一样:
             
             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);
    }
      

  6.   

    解决了,我kao,忘了重新赋值