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

进程间通信——使用WM_COPYDATA消息通信

2015-07-01 14:13 281 查看
使用SendMessage向另一进程发送WM_COPYDATA消息

发送WM_COPYDATA消息

SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)©Data);

copyData是要发送的数据,类型为COPYDATASTRUCT结构体

typedef struct tagCOPYDATASTRUCT {

ULONG_PTR dwData; //用户定义数据

DWORD cbData; //用户定义数据的长度

PVOID lpData; //指向用户定义数据的指针

} COPYDATASTRUCT, *PCOPYDATASTRUCT;

WM_COPYDATA消息只可以使用SendMessage函数(同步)发送,不可以使用PostMessage(异步)发送。

COPYDATA结构体的实质依然是共享内存,区别是这一片特殊的共享内存由操作系统管理而不用用户手动申请管理。

WM_COPYDATA适合小数据量的进程间通信,大数据量可能造成内存问题,以及界面卡死,因为消息的发送形式是同步的。

发送端

void CSendDlg::OnDataSend()

{

CWnd *pWnd = CWnd::FindWindow(NULL,"接收窗口的标题");

CString sCopyData = "HELLO";

COPYDATASTRUCT cpd;

cpd.dwData = 0;

cpd.cbData = sCopyData.GetLength() + 1;//多加一个长度,防止乱码

cpd.lpData = (void*)sCopyData.GetBuffer(cpd.cbData);

pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);

}

接收端

声明afx_msg void OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)

...

...

ON_MESSAGE(WM_COPYDATA, OnCopyData)

...

...

END_MESSAGE_MAP()

BOOL CReceiveDlg::OnCopyData( CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct )

{

AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));

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