实验八 进程间通信机制——消息传递
实验内容
在客户端(Client端)使用SendMessage函数发送消息到服务器端(Server端)实现进程间通信。
二、实验目的
由于Windows是事件驱动的,所以消息传递对于Windows编程是很重要的。通过实践来掌握Windows的消息传递机制。
实验原理
进程间的通信根据通信内容可以划分为两种:控制信息的传送与大批量数据的传送。消息传递机制是实现进程通信的一种方法。发送进程在发送消息之前,先在自己的内存空间设置一个发送区,把欲发送的消息填入其中。然后再用发送过程将其发送出去。接收进程则在接收消息之前,在自己的内存空间内设置相应的接收区,然后用接收过程接收消息。发送进程向消息冲区写消息,而不用管接收进程是否已经准备好要接收。接收进程则从消息缓冲区内读消息。
实验要求
程序需要实现客户端(Client端)和服务器端(Server端)。
客户端(Client端)需要两个Button控件,ID、Caption分别为:IDC BUTTON SendMessage、“发送消息”,IDC BUTTON OK、“确定”和一个ID为IDC EDIT1的EditBox控件。
服务器端(Server端)需要一个Button控件,ID、Caption分别为:IDC BUTTON OK、“确定”,一个ID为IDC EDIT1的Edit Box控件,一个ID、Caption分别为IDC STATIC、“接收消息”的Static Text控件。
实验步骤
创建一个基于对话框的名为Client的工程。
把控件拖到对话框上。
为IDC EDIT1添加类型为CString的成员变量m msg。
双击“发送消息”按钮,添加如下代码:
void CClientDig::OnBUTTONSendMessage()
{
CString str = "server”;
CWnd * pWnd = CWnd::FindWindow(NULL,str);
UpdateData(TRUE);
If(pWnd&&m msg!= T(””))
{
COPYDATASTRUCT buf;
buf.cbDate=lstrlen((LPTSTR)m msg.GetBuffer(0))+1;
buf.lpData=m msg.GetBuffer(0);
CString tmp= T(“发送“)+m msg+ T(“到Server”);
AfxMessageBox(tmp);
PWnd->SendMessage(WM COPYDATA.0,(LPARAM)&buf);
}
else
MessageBox( T(“No such Things.”));
}
在发送端首先需要找到目的窗口,如果目的窗口不存在则弹出对话框给用户以提示。在找到目的窗口的前提下,如果发送窗口内的数据不为空的话,以对话框的形式提示用户要发送消息,并用SendMessage函数来发送消息。
双击“确定”按钮,添加如下代码:
Void CClientDlg::OnButtonOk()
{
CDialog::OnOK();
}
Build Client.exe,点击图标.Output输出如下所示,则Client工程建立完毕.
Client.exe-0 error(s),0 warning(s)
新建一个基于对话框的名为Server的工程,方法同Client工程。
把控件拖到对话框上。
为IDC EDIT1添加类型为CString的成员变量m show。
双击“确定”按钮,添加如下代码:
Void CServerDig::OnBugttonOk()
{
CDialog::OnOK();
}
使用ClassWizard添加OnCopyData函数。
OnCopyData为消息映射函数,该函数主要用来获得来自发送方的消息,并将其显示到控件中,添加如下代码:
BOOL CServerDlg::OnCopyData(CWnd * pWnd,COPYDATASTRUCET* pCopyDataStruct)
{
CString str=(LPCSTR)(pCopyDataStruct->lpData);
CWnd * p2Wnd=GetDlgItem(IDC EDIT1);
UpdateData(TRUE);
P2Wnd->SetWindowsText(str);
Return CDialog::OnCopyData(pWnd,pCopyDagtaStruct);
}
Build Server.exe,方法同Client工程.
运行Client和Server.点击Client工程和Server工程的!图标.
求高人帮忙写写。。。
------解决方案--------------------
http://blog.csdn.net/agoago_2009/article/details/6716827