Windows核心编程——进程间通信之WM_COPYDATA

1.进程间通信

  进程间通信(IPC,InterProcess Communicate)就是指在不同进程之间传播或交换信息。
  IPC的常见通信方式包括管道、消息队列、Socket、文件内存映射、dll共享段、WMCOPYDATA

 

2.WM_COPYDATA

    一个程序通过WM_COPYDATA消息传递数据给另一个程序。

        该消息只能由 SendMessage() 发送 ,SendMessage()需要知道进程柄,所以一般都搭配FindWindow()使用。通过FindWindow查找进程句柄,然后使用SendMessage() 向这个句柄发送信息.

 

API函数:

typedef struct tagCOPYDATASTRUCT {
DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT;

 

示例:从进程A和B之间用COPYDATA通信:
1.创建对话框TESTCPD,添加发送按钮,添加事件:

HWND hWnd = ::FindWindow(NULL, "Recv");

COPYDATASTRUCT cds;
cds.dwData = 0x87654093;
char szBuff[] = { "hello !!!" };
cds.lpData = szBuff;
cds.cbData = sizeof(szBuff);

//发送WM_COPUDATA
::SendMessage(hWnd, WM_COPYDATA, (WPARAM)GetSafeHwnd(),(LPARAM)&cds);

 2.再创建一个对话框REC用来接受消息,再对话框类向导->虚函数->添加消息WM_COPYDATA BOOL 

BOOL CRECVCOPYDATADlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	CString csFmt;
	csFmt.Format("%08X %s", pCopyDataStruct->dwData, pCopyDataStruct->lpData);
	AfxMessageBox(csFmt);

	return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}DialogEx::OnCopyData(pWnd, pCopyDataStruct); }

 


测试A可以发送B:

 

 

测试A、B间发送的最大空间:

 

 

 空间非常大512M都可以发送。

 

 

问题:copydata携带的数据被修改不会影响发送者?(携带的数据实际是只读的)

目标进程能在自己的进程里直接读,是因为做了数据的拷贝。

 

 

    一块数据要通过COPUDATA 从A进程发送到B进程,先把A进程的一块数据拷贝至内核,再把数据从内核拷贝至B进程的用户区,所以修改B的数据不会对A有影响。


      如果携带的数据量大,还需多次拷贝,使用copydata效率会很低,所有WMCOPY DATA适用于携带量小,发送不频繁情况。




posted @ 2020-05-29 00:27  Wings_shadow  阅读(1989)  评论(0编辑  收藏  举报