中易网

VC, MFC, 对话框hWnd为NULL

答案:2  悬赏:40  
解决时间 2021-04-22 04:43
使用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类!
最佳答案
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;//对于非控件性质变量,可以随意访问,即使窗体已经被销毁也不受影响。

注:
窗体销毁,和对象销毁是两个概念,
窗体销毁,窗体和窗体的所有子窗体都不可以被访问,但此时的类对象是可用的。这个是另外的问题了,就不详细解释了。
全部回答
模态对话框dlg.domodle(); 非模态对话框用create创建。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
DNF公会的优秀成员能T人吗
怎么我没有问问图标呢
学水电安装有前途吗?温州哪有招水电学徒的吗
为什么烧伤输血浆?
开挖掘机为什么新手干活慢一点有什么 技巧能
谁知道超市卖的千岛酱那种更接近自助餐厅的?
我QQ 上怎么没有同吧啊?
八六年五分贰分壹分硬币价格
江锦路地址在什么地方,想过去办事
给我介绍湖南湘绣方面的东西!
中央厨房的操作流程或配送中心工作流程及管理
当今社会什么行业的市场最有前景?
天坝村地址在什么地方,我要处理点事
家里安了地暖,能装木地板么?有说可以,有说
麥蒂還有可能被交易出去麽、?
推荐资讯
什么是蒸汽冷凝水 温度有多高
摔了一跤脚肿了怎么消肿 是热敷还是冷敷
怎样让头发变浓密
女人,30岁,想买个10万左右的车,自动波的,
泌阳娇娇减肥在哪里
天津经济技术开发区第四大街77号
乐高埃及系列漫画
在杭州哪里买房价格实惠最适宜居住还可以落户
如何办理捐献眼角膜?
在嵊州卖笔记本电脑的有哪些地方?
买的南航的机票可以把里程积在法航的会员卡上
谁知道长丰县2015年乡镇公务员进去面试德多少
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?