VC, MFC, 对话框hWnd为NULL
使用MFC建了一个单文档工程,点击某个按钮的时候弹出一个对话框CIPAddressdlg,这个类有一个IP控件的变量m_ctrlIPAddress,我想调用m_ctrlI...
使用MFC建了一个单文档工程,点击某个按钮的时候弹出一个对话框CIPAddressdlg,这个类有一个IP控件的变量m_ctrlIPAddress,我想调用m_ctrlIPAddress里面的函数,但是失败了。提示说hWnd为0x00000000,调试发现,CIPAddressdlg 的指针IPdlg也是hWnd为0x00000000。只要问题出现在这两行代码:
CIPAddressdlg *IPdlg = new CIPAddressdlg(this);//hWnd为0x00000000
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)//hWnd为0x00000000
完整代码如下:
void CMainFrame::OnFtpUpload()
{
// TODO: Add your command handler code here
//choose the send file!
CFileDialog dlgFile(true);
if(dlgFile.DoModal() !=IDOK)
return;
CString pathName = dlgFile.GetPathName();
CIPAddressdlg *IPdlg = new CIPAddressdlg(this);
if(IPdlg->DoModal() != IDOK)
return;
CString strIP;
BYTE b1,b2,b3,b4;
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)
strIP.Format("%d.%d.%d.%d", b1, b2, b3,b4);
else
AfxMessageBox("IP地址不完整!");
InitWS(1,1);//这个版本号一定要与SERVER的相同。
//2.创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
//3.连接服务器端,无须绑定 127.0.0.1
if( !Connect(sockClient, (LPSTR)(LPCSTR)strIP, 6000))
{
AfxMessageBox("连接失败!"); return;
}
//4.接收服务器端发送的数据,并且向服务器端发送数据
char recvBuf[BUFFERSIZE];
recv(sockClient,recvBuf,sizeof(recvBuf),0);
AfxMessageBox(recvBuf);
bool ret = SendFile(sockClient, pathName.GetBuffer(pathName.GetLength()));
//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
pathName.ReleaseBuffer(pathName.GetLength());
//fileName.ReleaseBuffer(fileName.GetLength());
if(ret)
AfxMessageBox("send ok!\n");
else
AfxMessageBox("send fail!\n");
//5.关闭套接字,释放资源,并且终止对套接字库的使用
CloseSocket(sockClient);
printf("88\n");
}
注意:函数在CMainFrame类! 展开
CIPAddressdlg *IPdlg = new CIPAddressdlg(this);//hWnd为0x00000000
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)//hWnd为0x00000000
完整代码如下:
void CMainFrame::OnFtpUpload()
{
// TODO: Add your command handler code here
//choose the send file!
CFileDialog dlgFile(true);
if(dlgFile.DoModal() !=IDOK)
return;
CString pathName = dlgFile.GetPathName();
CIPAddressdlg *IPdlg = new CIPAddressdlg(this);
if(IPdlg->DoModal() != IDOK)
return;
CString strIP;
BYTE b1,b2,b3,b4;
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)
strIP.Format("%d.%d.%d.%d", b1, b2, b3,b4);
else
AfxMessageBox("IP地址不完整!");
InitWS(1,1);//这个版本号一定要与SERVER的相同。
//2.创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
//3.连接服务器端,无须绑定 127.0.0.1
if( !Connect(sockClient, (LPSTR)(LPCSTR)strIP, 6000))
{
AfxMessageBox("连接失败!"); return;
}
//4.接收服务器端发送的数据,并且向服务器端发送数据
char recvBuf[BUFFERSIZE];
recv(sockClient,recvBuf,sizeof(recvBuf),0);
AfxMessageBox(recvBuf);
bool ret = SendFile(sockClient, pathName.GetBuffer(pathName.GetLength()));
//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
pathName.ReleaseBuffer(pathName.GetLength());
//fileName.ReleaseBuffer(fileName.GetLength());
if(ret)
AfxMessageBox("send ok!\n");
else
AfxMessageBox("send fail!\n");
//5.关闭套接字,释放资源,并且终止对套接字库的使用
CloseSocket(sockClient);
printf("88\n");
}
注意:函数在CMainFrame类! 展开
若以下回答无法解决问题,邀请你更新回答
1个回答
展开全部
if(IPdlg->DoModal() != IDOK)
//代码执行到这里的时候窗体已经被销毁了
return;
DoModal()函数执行时,窗体创建
DoModal()函数返回时,窗体已经被销毁
如果要操作CDialog中的控件必须在窗体销毁前处理。
解决方案:
在IPDlg类中定义 CString m_strIP;
在IPDlog类OnOK 函数中执行
BYTE b1,b2,b3,b4;
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)
m_strIP.Format("%d.%d.%d.%d", b1, b2, b3,b4);
else
AfxMessageBox("IP地址不完整!");
然后修改调用代码:
if(IPdlg->DoModal() != IDOK)
return;
CString strIP = IPdlg->m_strIP;//对于非控件性质变量,可以随意访问,即使窗体已经被销毁也不受影响。
注:
窗体销毁,和对象销毁是两个概念,
窗体销毁,窗体和窗体的所有子窗体都不可以被访问,但此时的类对象是可用的。这个是另外的问题了,就不详细解释了。
//代码执行到这里的时候窗体已经被销毁了
return;
DoModal()函数执行时,窗体创建
DoModal()函数返回时,窗体已经被销毁
如果要操作CDialog中的控件必须在窗体销毁前处理。
解决方案:
在IPDlg类中定义 CString m_strIP;
在IPDlog类OnOK 函数中执行
BYTE b1,b2,b3,b4;
if(IPdlg->m_ctrlIPAddress.GetAddress(b1, b2, b3, b4)==4)
m_strIP.Format("%d.%d.%d.%d", b1, b2, b3,b4);
else
AfxMessageBox("IP地址不完整!");
然后修改调用代码:
if(IPdlg->DoModal() != IDOK)
return;
CString strIP = IPdlg->m_strIP;//对于非控件性质变量,可以随意访问,即使窗体已经被销毁也不受影响。
注:
窗体销毁,和对象销毁是两个概念,
窗体销毁,窗体和窗体的所有子窗体都不可以被访问,但此时的类对象是可用的。这个是另外的问题了,就不详细解释了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询