为对话框中的两个edit关联了不同的Cstring变量,但只对一个赋值,然后UpdateData(false),但两个edit都有值了,why??

解决方案 »

  1.   

    实际问题是我的对话框中有3个edit,我在OnInitDialog中对他们赋值
    CMyDlg::OnInitDialog
    {
       if(...)//对第一个变量赋值
       {
            m_strEdit1="zhang san";//我保证这一步肯定做了
        }   if(...)//对第二个变量赋值
       {
            m_strEdit2="li si";//我保证这一步肯定也做了
        }
        
        UpdateData(false);
        //按照我的想法他们应该不一样,可他们的值是一样的,都为"li si";
        //究竟应该怎样写
    }
      

  2.   

    我个人认为,你在为第一个赋值的时候,给第二个空就可以了,因为你一UPDATEDATA()后,有可能系统就会给第二个赋以默认值吧,呵呵
      

  3.   

    在调用UpdateData(FALSE)之前要先调用UpdateData(TRUE),这两个是成对的
      

  4.   

    to tracing:
       你的意思是对第一个变量赋制之后,用UpdateData(false)
       然后在对第二个变量赋制之前,调用UpdateDate(true),然后赋制,然后再调用UpdateDate(false)吗?  如果不是,那么应该怎样才可以实现我的想法呢?给个代码,谢谢!!!
      

  5.   

    不过我这样试了一下,也没问题啊
    m_string1 = "test";
    m_string2 = "111";
    UpdateData(FALSE);
    没出现你所说的问题
      

  6.   

    BOOL CCopyConfigureDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    HKEY hKeyDefaultPath;
    LONG lResultDefaultPath;
    lResultDefaultPath=RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\JS\\DefaultPath",&hKeyDefaultPath);
    if (ERROR_SUCCESS==lResultDefaultPath)
    {
    CString strPathBuffer;
    DWORD dwLength;
    RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,NULL,&dwLength);
    RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,
                 (LPBYTE)(LPTSTR)(LPCTSTR)strPathBuffer,&dwLength);
    MessageBox(strPathBuffer,"Default Path");

    RegCloseKey(hKeyDefaultPath);
       
    m_strDefaultPath=strPathBuffer;//m_strDefaultPath是第一个变量
        
    }
    else
    {
    RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\JS\\DefaultPath",&hKeyDefaultPath);
    char   szModuleFileName[MAX_PATH];   
    GetModuleFileName(AfxGetInstanceHandle(),szModuleFileName,MAX_PATH); 
    CString strDefaultPath=szModuleFileName;
    strDefaultPath=strDefaultPath.Left(strDefaultPath.ReverseFind('\\'));  
    strDefaultPath=strDefaultPath.Left(strDefaultPath.ReverseFind('\\'));
    RegSetValueEx(hKeyDefaultPath,"Default Path",NULL,REG_SZ,(const BYTE*)(LPTSTR)(LPCTSTR)strDefaultPath,strlen(strDefaultPath)+1);
    RegCloseKey(hKeyDefaultPath); m_strDefaultPath=strDefaultPath;

    }    
    HKEY hKeyUserName;
    LONG lResultUserName;
    lResultUserName=RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\JS\\UserName",&hKeyUserName);
    if (ERROR_SUCCESS==lResultUserName)
    {
    CString strBuffer;
    DWORD dwLength;
    RegQueryValueEx(hKeyUserName,"User Name",NULL,NULL,NULL,&dwLength);
    RegQueryValueEx(hKeyUserName,"User Name",NULL,NULL,
                 (LPBYTE)(LPTSTR)(LPCTSTR)strBuffer,&dwLength);
    MessageBox(strBuffer,"User Name");

    RegCloseKey(hKeyUserName); m_strUserName=strBuffer;//m_strUserName是第二个变量

    }
    else
    {
    RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\JS\\UserName",&hKeyUserName);
    //  char   szModuleFileName[MAX_PATH];   
    //  GetModuleFileName(AfxGetInstanceHandle(),szModuleFileName,MAX_PATH); 
    //  CString strDefaultPath=szModuleFileName;
    //  strDefaultPath=strDefaultPath.Left(strDefaultPath.ReverseFind('\\'));  
    //  strDefaultPath=strDefaultPath.Left(strDefaultPath.ReverseFind('\\'));
    //  RegSetValueEx(hKeyDefaultPath,"Default Path",NULL,REG_SZ,(const BYTE*)(LPTSTR)(LPCTSTR)strDefaultPath,strlen(strDefaultPath)+1);
    RegCloseKey(hKeyUserName);
    // 
    }
        
    //     m_strDefaultPath="path";//这样连续三行赋制再调用UpdateData(false)是正确的
    //  m_strUserName="UserName";
    //  m_strPassword="pd";
     
      UpdateData(FALSE);
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
      

  7.   

    hKeyUserName的值跟hKeyDefaultPath的值是一样的,不知道是不是这里出了问题,应该不是UPDATE的问题,同事催我了,明天再看啊,抱歉
      

  8.   

    好象是读注册表的问题,在第一次读注册表之后strPathBuffer是正确的,但在第二此读注册表之后,strPathBuffer的值就变的和strBuffer一样了,所以在UpdateData(false)就总是一样了,虽然不知道原因,但可以确定的是和UpdateData(false)无关,我已经解决了谢谢各位的帮助
      

  9.   

    if (ERROR_SUCCESS==lResultDefaultPath)
    {
    CString strPathBuffer;
    DWORD dwLength;
    UpdateData(); <<-------开始更新数据
    RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,NULL,&dwLength);
    RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,
                 (LPBYTE)(LPTSTR)(LPCTSTR)strPathBuffer,&dwLength);
    MessageBox(strPathBuffer,"Default Path");

    RegCloseKey(hKeyDefaultPath);
       
    m_strDefaultPath=strPathBuffer;//m_strDefaultPath是第一个变量 UpdateData(FALSE);<<-------更新数据结束
        
    } if (ERROR_SUCCESS==lResultUserName)
    {
    CString strBuffer;
    DWORD dwLength;
    UpdateData();   <<-------------开始更新数据
    RegQueryValueEx(hKeyUserName,"User Name",NULL,NULL,NULL,&dwLength);
    RegQueryValueEx(hKeyUserName,"User Name",NULL,NULL,
                 (LPBYTE)(LPTSTR)(LPCTSTR)strBuffer,&dwLength);
    MessageBox(strBuffer,"User Name");

    RegCloseKey(hKeyUserName); m_strUserName=strBuffer;//m_strUserName是第二个变量
                      
                      UpdateData(FALSE);<<---------更新数据结束


    }
    现在是正常了,还是UpdateData()的问题,我单步走了一下,当strPathBuffer有值的时候,strBuffer也有同样的值,使用UpdateData(),可以将该变量清空,具体为什么两个变量的值会一样,我还没搞明白,望高手赐教
      

  10.   

    strBuffer的值不是在第二次读注册表之后变的,第一次读注册表的时候,strBuffer就有值了,跟strPathBuffer一样的值,你把两个变量放到if语句外边,做为全局的,就能看到strBuffer什么时候变化了
      

  11.   

    to whiteclouds:
       注册表这两个位置的值不是一样的,至于strPathBuffer和strBuffer他们的值为什么会一样,我不清楚
           另怎么结帖,给分啊   我要编程去了,上面催了
      

  12.   

    呵呵,我问了高手,终于找到原因了,是内存越界的问题,这样处理就对了
    if (ERROR_SUCCESS==lResultDefaultPath)
    {
    DWORD dwLength; RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,NULL,&dwLength);
    LPTSTR lpsValue = strPathBuffer.GetBuffer(dwLength + 1););<<----这里
    RegQueryValueEx(hKeyDefaultPath,"Default Path",NULL,NULL,
                 (LPBYTE)lpsValue,&dwLength);<<----这里
    MessageBox(strPathBuffer,"Default Path");
    strPathBuffer.ReleaseBuffer(););<<----这里

    RegCloseKey(hKeyDefaultPath);
       
    m_strDefaultPath=strPathBuffer;//m_strDefaultPath是第一个变量
        
    }
    直接转换类型是不会分配内存的,类似的都这样处理就OK了