【网络】MFC实现Ping命令的界面操作

今天忙了一个下午终于把ping的应用程序写好了,起初是用VS2008写的,但是当创建ping线程时却无法正常给线程函数传递参数。

//=================================== UpdateData(TRUE); char* pIP = NULL; pIP = (char*)&m_dwIPAddress; CString strIP; strIP.Format(_T("%u.%u.%u.%u"),*(pIP+3), *(pIP+2), *(pIP+1), *pIP); //=================================== AfxBeginThread(CPingProc, (LPVOID)this);

代码如上所示,因为我在线程函数数种要访问应用程序的句柄(m_hWnd)和IP地址,因此我想把this指针传递给线程函数CPingProc,但是当执行完函数AfxBeginThread以后,this值发生变化,而在线程函数体中代码中(如下),将lpParam强制类型转换成CWinPingDlg*类型,但是调用GetSafeHwnd()函数却无法获取句柄,而且调试过程中一些局部变量无法跟踪观察,后来将参数改为指针应用(LPVOID&)*this还是没用,

UINT CPingProc(LPVOID lpParam) { CWinPingDlg* pDlg = (CWinPingDlg*)lpParam; HWND hWnd = pDlg->GetSafeHwnd(); char* destination = "1.1.1.1";//"211.87.100.123";

上网查找了很久没找到答案让人很郁闷~~无奈之下,从VS2008迁移到VC6.0,同样的代码运行无误。。。很无语。。。。

ok,接下来讲解一下在VC6.0下如何实现用应用程序实现ping命令。

第一步:创建一个基于Dialog的MFC Project-------Ping,界面设计如下ping

第二步:添加线程函数代码如下

UINT CPingProc(LPVOID lpParam) { CPingDlg* pDlg = (CPingDlg*)lpParam; BYTE nFiled[4]; CString strIP; if (pDlg->m_IPAddress.GetAddress(nFiled[0], nFiled[1], nFiled[2], nFiled[3]) < 4) { strIP = pDlg->m_strURL; } else { strIP.Format("%u.%u.%u.%u", nFiled[0], nFiled[1], nFiled[2], nFiled[3]); } char* pIP = strIP.GetBuffer(strIP.GetLength()); Ping(pIP, pDlg->m_nTimes, pDlg->m_nDataSize, pDlg->GetSafeHwnd()); return 0; }

其中Ping()函数是用C语言实现的ping命令的函数接口,下次具体说明Ping的代码^_^.

第三步:添加Start按钮的消息响应函数

void CPingDlg::OnButtonPing() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_ThreadPing = AfxBeginThread(CPingProc, (LPVOID)this); //Start Ping thread }

第四步:在CPingDlg中自定义用户消息UM_RESPONSE, 添加UM_RESPONSE的消息响应函数LRESULT OnResponse(WPARAM wParam, LPARAM lParam)

LRESULT CPingDlg::OnResponse(WPARAM wParam, LPARAM lParam) { char* s = (char*)lParam; static int nLine = 0; m_lbDetails.InsertString(nLine++, s); return 1; }

第五步:添加Stop按钮的消息响应函数

void CPingDlg::OnButtonStop() { if (m_ThreadPing != NULL) // whether Ping Thread is created? { TerminateThread(m_ThreadPing->m_hThread, EXIT_FAILURE); char* msg = "Stop pinging!"; this->SendMessage(UM_RESPONSE, 0, LPARAM(msg)); } }

编译运行,效果图

ping2