为对话框中的两个edit关联了Cstring变量,但只对一个赋值,然后UpdateData(false),但两个edit都有值了,why?? 为对话框中的两个edit关联了不同的Cstring变量,但只对一个赋值,然后UpdateData(false),但两个edit都有值了,why?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 实际问题是我的对话框中有3个edit,我在OnInitDialog中对他们赋值CMyDlg::OnInitDialog{ if(...)//对第一个变量赋值 { m_strEdit1="zhang san";//我保证这一步肯定做了 } if(...)//对第二个变量赋值 { m_strEdit2="li si";//我保证这一步肯定也做了 } UpdateData(false); //按照我的想法他们应该不一样,可他们的值是一样的,都为"li si"; //究竟应该怎样写} 我个人认为,你在为第一个赋值的时候,给第二个空就可以了,因为你一UPDATEDATA()后,有可能系统就会给第二个赋以默认值吧,呵呵 在调用UpdateData(FALSE)之前要先调用UpdateData(TRUE),这两个是成对的 to tracing: 你的意思是对第一个变量赋制之后,用UpdateData(false) 然后在对第二个变量赋制之前,调用UpdateDate(true),然后赋制,然后再调用UpdateDate(false)吗? 如果不是,那么应该怎样才可以实现我的想法呢?给个代码,谢谢!!! 不过我这样试了一下,也没问题啊 m_string1 = "test"; m_string2 = "111"; UpdateData(FALSE);没出现你所说的问题 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} hKeyUserName的值跟hKeyDefaultPath的值是一样的,不知道是不是这里出了问题,应该不是UPDATE的问题,同事催我了,明天再看啊,抱歉 好象是读注册表的问题,在第一次读注册表之后strPathBuffer是正确的,但在第二此读注册表之后,strPathBuffer的值就变的和strBuffer一样了,所以在UpdateData(false)就总是一样了,虽然不知道原因,但可以确定的是和UpdateData(false)无关,我已经解决了谢谢各位的帮助 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(),可以将该变量清空,具体为什么两个变量的值会一样,我还没搞明白,望高手赐教 strBuffer的值不是在第二次读注册表之后变的,第一次读注册表的时候,strBuffer就有值了,跟strPathBuffer一样的值,你把两个变量放到if语句外边,做为全局的,就能看到strBuffer什么时候变化了 to whiteclouds: 注册表这两个位置的值不是一样的,至于strPathBuffer和strBuffer他们的值为什么会一样,我不清楚 另怎么结帖,给分啊 我要编程去了,上面催了 呵呵,我问了高手,终于找到原因了,是内存越界的问题,这样处理就对了 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了 关于CInternetSession的问题,急!!! Socket共享的问题 应用程序的打开方式是什么?我系统坏掉修复后在打开.exe文件时要我选择打开方式? 大家帮我出出主意呀,谢谢了 怎么将屏幕上或者其他设备环境指定区域内的图象转化为bitmap? 获得计算机内存的API函数是什么? 请教:当对话筐大小改变时,怎么及时改变上面的画,让他随着比例改变?(在线关注) 关于编译原理和数据结构 请问:怎么破译C生成的EXE文件? 遍历窗体问题. m_pRecordset->Open 出错,怎么回事 关于开发视频转发服务器
CMyDlg::OnInitDialog
{
if(...)//对第一个变量赋值
{
m_strEdit1="zhang san";//我保证这一步肯定做了
} if(...)//对第二个变量赋值
{
m_strEdit2="li si";//我保证这一步肯定也做了
}
UpdateData(false);
//按照我的想法他们应该不一样,可他们的值是一样的,都为"li si";
//究竟应该怎样写
}
你的意思是对第一个变量赋制之后,用UpdateData(false)
然后在对第二个变量赋制之前,调用UpdateDate(true),然后赋制,然后再调用UpdateDate(false)吗? 如果不是,那么应该怎样才可以实现我的想法呢?给个代码,谢谢!!!
m_string1 = "test";
m_string2 = "111";
UpdateData(FALSE);
没出现你所说的问题
{
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
}
{
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(),可以将该变量清空,具体为什么两个变量的值会一样,我还没搞明白,望高手赐教
注册表这两个位置的值不是一样的,至于strPathBuffer和strBuffer他们的值为什么会一样,我不清楚
另怎么结帖,给分啊 我要编程去了,上面催了
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了