您的位置:首页 > 运维架构

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WM_COPYDATA 乱码