WM_COPYDATA两个对话框之间传递数据的乱码问题
2014-04-24 10:13
666 查看
WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用户定义数据
DWORD cbData;//数据大小
PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;
该结构用来定义用户数据。
了解该结构体后,然后再发送方调用
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
其中,hwnd指的是接收端的句柄,WM_COPYDATA对应的十六进制数为0x004A
wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构。
接收端重载ON_WM_COPYDATA消息映射函数:
在头文件中添加afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
添加消息映射:
源文件中BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加ON_WM_COPYDATA()
响应函数:
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}
(当然也可以通过类向导直接添加消息)
example:
发送端:我们关联一个编辑框控件变量m_str;一个按钮;
void CCopyDataSendDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HWND m_recieveDlg;
m_recieveDlg=::FindWindow(NULL,_T("CopyDataRecieve"));
CString s;
UpdateData();
s=m_str;
COPYDATASTRUCT copyData;
copyData.dwData=0;
copyData.cbData=(s.GetLength()+1)*sizeof(TCHAR);//注意这里计算字符串长度最好计算UNICODE模式下的宽字节数,否则会出现乱码。
copyData.lpData=(void*)s.GetBuffer(copyData.cbData);
::SendMessage(m_recieveDlg,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)©Data);
s.ReleaseBuffer();
}
接收端:我们也关联一个文本控件变量m_RecvData;
BOOL CCopyDataRecieveDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pCopyDataStruct->cbData > 0)
{
m_RecvData=(LPCTSTR)(pCopyDataStruct->lpData);
UpdateData(0);
}
return TRUE;
}
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用户定义数据
DWORD cbData;//数据大小
PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;
该结构用来定义用户数据。
了解该结构体后,然后再发送方调用
SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
其中,hwnd指的是接收端的句柄,WM_COPYDATA对应的十六进制数为0x004A
wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构。
接收端重载ON_WM_COPYDATA消息映射函数:
在头文件中添加afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
添加消息映射:
源文件中BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加ON_WM_COPYDATA()
响应函数:
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}
(当然也可以通过类向导直接添加消息)
example:
发送端:我们关联一个编辑框控件变量m_str;一个按钮;
void CCopyDataSendDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HWND m_recieveDlg;
m_recieveDlg=::FindWindow(NULL,_T("CopyDataRecieve"));
CString s;
UpdateData();
s=m_str;
COPYDATASTRUCT copyData;
copyData.dwData=0;
copyData.cbData=(s.GetLength()+1)*sizeof(TCHAR);//注意这里计算字符串长度最好计算UNICODE模式下的宽字节数,否则会出现乱码。
copyData.lpData=(void*)s.GetBuffer(copyData.cbData);
::SendMessage(m_recieveDlg,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)©Data);
s.ReleaseBuffer();
}
接收端:我们也关联一个文本控件变量m_RecvData;
BOOL CCopyDataRecieveDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (pCopyDataStruct->cbData > 0)
{
m_RecvData=(LPCTSTR)(pCopyDataStruct->lpData);
UpdateData(0);
}
return TRUE;
}
相关文章推荐
- (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- [转]如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如果在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 两个程序之间传递数据可以使用wm_copydata
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- [转帖]在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如果在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 利用 WM_COPYDATA 消息 在 C# 和 传统C++应用之间传递数据时,64位平台的问题
- 如何在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 如果在C#用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 两个Activities之间的数据传递问题解决1
- C#两个界面之间数据传递的问题
- 进程之间通讯:M_COPYDATA消息来实现两个进程之间传递数据.