非模式对话框中读取文件出错
我定义一个非模式对话框有一个CFile的指针,文件是在主窗体中打开的,通过指针传递到非模式对话框中代码如下
CFile sfile(filename,CFile::modeRead|CFile::typeBinary);
SendFileForm m_SendForm;
m_SendForm.m_FileName=sfile.GetFileName();//取得文件名
m_SendForm.m_FileSize=sfile.GetLength();//取得文件大小
m_SendForm.m_DK=12000;//确定端口
m_SendForm.pos=0;
m_SendForm.m_SendFile=&sfile;//传递指针
CString filemsg;
filemsg.Format("FIL%d:%d:",m_SendForm.m_DK,m_SendForm.m_FileSize);
filemsg+=m_SendForm.m_FileName;
p->SSock->Send(filemsg,filemsg.GetLength());
m_SendForm.Create(IDD_SENDFILEFORM_DIALOG);
m_SendForm.ShowWindow(SW_SHOW);
打开非模式对话框后我的代码出错
ReadSize=m_SendFile->Read(buf,BUFSIZE);
问题点数:100、回复次数:7Top
1 楼bohut(●伯虎● )回复于 2004-12-03 15:51:26 得分 20
为buf申请了内存控件了没有?Top
2 楼wsw1978(wsw1978)回复于 2004-12-03 15:51:43 得分 0
如果将下面的代码
m_SendForm.Create(IDD_SENDFILEFORM_DIALOG);
m_SendForm.ShowWindow(SW_SHOW);
改为m_SendForm.DoModal();
就没问题请教高手Top
3 楼wsw1978(wsw1978)回复于 2004-12-03 15:53:46 得分 0
当然有UCHAR buf[BUFSIZE]={0};Top
4 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-12-03 15:57:58 得分 0
?
把代码发到我的邮箱:
DentistryDoctor@msn.com
?Top
5 楼wsw1978(wsw1978)回复于 2004-12-03 16:10:36 得分 0
窗体中创建非模式对话框
CFile sfile(filename,CFile::modeRead|CFile::typeBinary);
SendFileForm m_SendForm;
m_SendForm.m_FileName=sfile.GetFileName();//取得文件名
m_SendForm.m_FileSize=sfile.GetLength();//取得文件大小
m_SendForm.m_DK=12000;//确定端口
m_SendForm.pos=0;
m_SendForm.m_SendFile=&sfile;//传递指针
CString filemsg;
filemsg.Format("FIL%d:%d:",m_SendForm.m_DK,m_SendForm.m_FileSize);
filemsg+=m_SendForm.m_FileName;
p->SSock->Send(filemsg,filemsg.GetLength());
m_SendForm.Create(IDD_SENDFILEFORM_DIALOG);
m_SendForm.ShowWindow(SW_SHOW);
非模式对话框中的代码
UCHAR buf[BUFSIZE]={0};
long ReadSize=0;
ReadSize=m_SendFile->Read(buf,BUFSIZE);//这一行出错
如果将下面的代码
m_SendForm.Create(IDD_SENDFILEFORM_DIALOG);
m_SendForm.ShowWindow(SW_SHOW);
改为模式对话框m_SendForm.DoModal();对话框中的代码不变就不出错
不知道说清楚没有,有什么不清楚请指出来.
请大家指点一下
Top
6 楼danyueer(淡月儿:从此以后,各人得各人的眼泪罢了)回复于 2004-12-03 16:14:03 得分 80
解析一下你的代码:
CFile sfile(filename,CFile::modeRead|CFile::typeBinary); // CFile sfile生命周期开始
……
m_SendForm.ShowWindow(SW_SHOW);
当创建非模态对话框的函数结束以后,sfile就会被销毁,此时对话框仍然存在,其中仍然引用文件指针,而事实上这个文件对象已经不存在了,所以造成错误。
解决的办法一是用模态对话框,二是把sfile作为主对话框类的成员变量。
Top
7 楼wsw1978(wsw1978)回复于 2004-12-03 16:29:58 得分 0
谢谢,确实是sfile的生命周期的问题Top




