今天忙了一个下午终于把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,界面设计如下

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

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

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));
}
}

编译运行,效果图

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