我使用RegOpenKeyEx打开注册表后,然后用RegQueryValueEx多次读,获得多个键名的键值赋给不同的变量,捕捉错误的时候总是莫名其妙的某一个或者某几个出现问题。

解决方案 »

  1.   

    估计是你的一个参数有问题! HKEY hKey;
    long reg=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"DYCECS",0L,KEY_READ,&hKey);
    if(reg!=ERROR_SUCCESS)
    {
    MessageBox("无法打开相关的键值,请运行ECS.reg文件注册");
    return FALSE;
    }
    char Value[50]={""};
        DWORD dwValue;
    DWORD w=50;//sizeof(DWORD);
    DWORD dww=sizeof(DWORD);
    DWORD type=REG_SZ;
    DWORD type1=REG_DWORD;
    reg=::RegQueryValueEx(hKey,"X",NULL,&type1,(BYTE*)&dwValue,&dww);
    point.x=dwValue;
        reg=::RegQueryValueEx(hKey,"Y",NULL,&type1,(BYTE*)&dwValue,&dww);
    point.y=dwValue;
        reg=::RegQueryValueEx(hKey,"COM",NULL,&type1,(BYTE*)&dwValue,&dww);
    COM=dwValue+1;
        reg=::RegQueryValueEx(hKey,"DelayIn",NULL,&type1,(BYTE*)&dwValue,&dww);
        DelayIn=(int)(dwValue/10);
        reg=::RegQueryValueEx(hKey,"DelayOut",NULL,&type1,(BYTE*)&dwValue,&dww);
        DelayOut=(int)(dwValue/100);
        reg=::RegQueryValueEx(hKey,"COLOR1",NULL,&type1,(BYTE*)&dwValue,&dww);
        COLOR1=dwValue;
        reg=::RegQueryValueEx(hKey,"COLOR2",NULL,&type1,(BYTE*)&dwValue,&dww);
        COLOR2=dwValue;
        reg=::RegQueryValueEx(hKey,"HEAV1",NULL,&type1,(BYTE*)&dwValue,&dww);
        HEAV1=dwValue;
        reg=::RegQueryValueEx(hKey,"HEAV2",NULL,&type1,(BYTE*)&dwValue,&dww);
        HEAV2=dwValue;
        reg=::RegQueryValueEx(hKey,"THIN",NULL,&type1,(BYTE*)&dwValue,&dww);
        THIN=dwValue;
        reg=::RegQueryValueEx(hKey,"B_",NULL,&type,(BYTE*)Value,&w);
        B_[0]=atof(Value);
    w=50;
        reg=::RegQueryValueEx(hKey,"B_H",NULL,&type,(BYTE*)Value,&w);
        B_[1]=atof(Value);看看! 这个是我的工程中的可以的
      

  2.   

    我的代码是这样的,总是莫名其妙的某一个出毛病,而把他们的在程序中的查询位置换一换,有时候就好用了,但有时侯,还会出毛病
    代码如下,请帮我指出错误的地方。
    其中,存储键值的变量都为LPBYTE类型(LPBYTE DSN),再构造函数中初始化为
    DSN=new BYTE[20]
    HKEY hKEY;
    LPCTSTR data_Set="SOFTWARE\\SSHIS\\XTWH";
    long ret=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY));
    if(ret!=ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
    {
    AfxMessageBox("错误:无法打开有关的hKEY");
    return;
    }
    DWORD type=REG_SZ;//定义数据类型
    DWORD Cd1=20;//定义数据长度
    DWORD Cd2=40;
    ret=::RegQueryValueEx(hKEY,"DSN",NULL,&type,DSN,&Cd1);
    if(ret!=ERROR_SUCCESS)
    {
    AfxMessageBox("错误:无法查询有关键名为DSN的注册表信息");
    return;
    }
    ret=::RegQueryValueEx(hKEY,"LogID",NULL,&type,LogID,&Cd1);
    if(ret!=ERROR_SUCCESS)
    {
    AfxMessageBox("错误:无法查询有关键名为LogID的注册表信息");
    return;
    }
    ret=::RegQueryValueEx(hKEY,"USEDSN",NULL,&type,useDSN,&Cd1);
    if(ret!=ERROR_SUCCESS)
    {
    AfxMessageBox("错误:无法查询有关键名为USEDSN的注册表信息");
    return;
    }
    ret=::RegQueryValueEx(hKEY,"LogPwd",NULL,&type,LogPWD,&Cd1);
    if(ret!=ERROR_SUCCESS)
    {
    AfxMessageBox("错误:无法查询有关键名为LogPWD的注册表信息");
    return;
    }

    ::RegCloseKey(hKEY);
      

  3.   

    每次调用RegQueryValueEx()后,Cd1的值可能改变。你确信每次读出来串的长度都是20吗?
      

  4.   

    每次调用RegQueryValueEx()后,Cd1的值可能改变。你确信每次读出来串的长度都是20吗?对!
    者就是问题所在!我的例子中dwWord=50;每次确定!!
      

  5.   

    你试试这样
    unsigned char tmp[256]="\0"; DWORD type=REG_SZ;
    DWORD size=80; ret=::RegQueryValueEx(hKEY,"Path", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }

        //取得软件安装根目录
    gl_SoftInfo.Path = CString(tmp); type=REG_SZ;
        size=80;
    memcpy(tmp,"\0",256);
    ret=::RegQueryValueEx(hKEY,"SQLServerIP", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
    //获得数据库服务器地址
    gl_SoftInfo.SQLServerIP = CString(tmp);

    type=REG_SZ;
        size=80;
        memcpy(tmp,"\0",256);
    ret=::RegQueryValueEx(hKEY,"SQLServerUser", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
    //获得数据库服务器用户
    gl_SoftInfo.SQLServerUser = CString(tmp); type=REG_SZ;
        size=80;
    memcpy(tmp,"\0",256);
    ret=::RegQueryValueEx(hKEY,"SQLServerPassWord", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
    //获得数据库服务器用户口令
    gl_SoftInfo.SQLServerPassword = CString(tmp); type=REG_SZ;
        size=80;
    memcpy(tmp,"\0",256);
    ret=::RegQueryValueEx(hKEY,"FtpServerIP", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
    //获得FTP服务器地址
    gl_SoftInfo.FtpServerIP = CString(tmp); type=REG_SZ;
        size=80;
    memcpy(tmp,"\0",256);
    ret=::RegQueryValueEx(hKEY,"FTPServerUser", NULL,&type,tmp,&size);
    if(ret!=ERROR_SUCCESS)
    {
    ::MessageBox(NULL,"无法查询有关注册表信息!","读取注册表",MB_ICONSTOP|MB_OK);
    return FALSE;
    }
      

  6.   

    楼上说的对,把MSDN看清楚, lpcbData既是一个输入参数,也是一个输出参数,每回都应该重新附值。