《2022年MFC发送字符串消 .pdf》由会员分享,可在线阅读,更多相关《2022年MFC发送字符串消 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VC/MFC 不同进程间的消息通信与数据(字符串 )发送3.4 使用 WM_COPYDATA消息通信对于少量数据可以用WM_COPYDATA方便地实现通信。由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。所以,对于大量数据来说,用 SendMessage()就容易造成窗口假死。3.4.1 通过 WM_COPYDATA消息实现进程间通信的方法在 Win32 中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK 文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修
2、改数据。这个函数的原型如下: SendMessage(WM_COPYDATA,wParam,lParam) 其中 wParam 设置为包含数据的窗口句柄,lParam 指向一个COPYDATASTRUCT的结构,其定义为:typedef struct tagCOPYDATASTRUCT DWORD dwData; DWORD cbData; PVOID lpData; COPYDATASTRUCT; 其中 dwData 为自定义数据,cbData 为数据大小,lpData 为指向数据的指针。需要注意的是, WM_COPYDATA消息保证发送的数据从原进程复制到目标进程。但是,WM_COPYDA
3、TA消息不能发送HDC、HBITMAP之类的东西,它们对于目标进程来说是无效的。目标进程得到这些数据不能在原进程作任何事情,因为它们属于不同的进程。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 4 页 - - - - - - - - - 与其他进程通信方法一样,要实现进程间的数据通信,在发送数据的程序中,首先要找到接收数据进程的窗口句柄pWnd,可以用 CWnd:FindWindow(NULL,_ T(DataRecv)函数来得到,其中字符串DataRecv为接收数据的
4、程序名。然后用SendMessage()函数发送数据,其具体的做法见后面的实例。在接收数据的程序中,首先在消息映射表中增加WM_COPYDATA消息映射,然后定义消息映射函数,其函数的格式为:BOOL CDataRecvDlg:OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) / 增加用户自定义程序代码 3.4.2 通过 WM_COPYDATA消息实现进程间通信的实例与前面所说的自定义消息不一样,WM_COPYDATA消息是 Win32 提供的消息。与自定义消息相比较, WM_COPYDATA消息可以传递一个较大的数据块。这里仍然用
5、两个对话框程序来实现WM_COPYDATA消息的通信。以下分别给出发送数据程序的发送函数和接收数据程序的接收函数。在发送数据的对话框类CDataSendDlg 中,用 MFC ClassWizard 工具或者手工的方法增加函数void CDataSendDlg:OnSendCopydata() ,其具体代码如下:CString m_strCopyData; /需要发送与接收的字符串void CDataSendDlg:OnSendCopydata() UpdateData(); / 更新数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
6、- - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - CWnd *pWnd=CWnd:FindWindow(NULL,_T(DataRecv); / 查找 DataRecv 进程if(pWnd=NULL) AfxMessageBox(Unable to find DataRecv.); return; COPYDATASTRUCT cpd; / 给 COPYDATASTRUCT结构赋值cpd.dwData = 0; cpd.cbData = m_strCopyData.GetLength(); cpd.lpData = (void*)m_
7、strCopyData.GetBuffer(cpd.cbData); pWnd-SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd); / 发送 在用 MFC AppWizard(exe) 创建接收数据的对话框程序后,生成对话框类CDataRecvDlg 。在这个类中, 首先要定义接收WM_COPYDATA消息的映射, 可以用 ClassWizard 工具来增加,也可以手动增加,但手动增加需要修改三个地方:在消息映射表中增加ON_WM_COPYDATA();增加成员函数BOOL CDataRecvDlg:OnCopyData();在CDataRecvDlg 类中
8、增加 WM_COPYDATA消息映射函数的定义。WM_COPYDATA消息的映射如下:BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog) /AFX_MSG_MAP(CDataRecvDlg) ON_WM_COPYDATA() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - /AFX_MSG_MAP END_MESSAGE_MAP() CDataRecvDlg:OnCopyData() 函数的定义如下
9、:BOOL CDataRecvDlg:OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) m_strCopyData=(LPSTR)pCopyDataStruct-lpData; / 获得实际长度的字符串m_strCopyData=m_strCopyData.Left(pCopyDataStruct-cbData); / 更新数据UpdateData(FALSE); return CDialog:OnCopyData(pWnd, pCopyDataStruct); 其中 m_strCopyData 为接收到的字符串,pCopyDataStruct 为 COPYDATASTRUCT结构指针。注意由pCopyDataStruct 直接得到的m_strCopyData 字符串长度可能不是实际发送的字符串长度,需要用发送字符串时所给定的字符串长度来进一步确定,其长度由pCopyDataStruct -cbData 来得到。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -