WM_COPYDATA是一种非常简单的进程间通信的方式,很容易实现。下面是一个使用WM_COPYDATA来实现进程间通信的一个例子。发送端,接收端的例子代码摘自 http://blog.csdn.net/111222/archive/2001/10/10/7241.aspx
发送端:
HWND hWnd = FindWindow(NULL,"MyApp");
if(hWnd!=NULL)
{
COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/
cpd.dwData = 0;
cpd.cbData = strlen("字符串");
cpd.lpData = (void*)"字符串";
::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!
/*完事儿了!!*/
}
接收端:
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
ON_WM_COPYDATA()/*消息映射*/
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/
return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}
很简单吧。好,我们来看看COPYDATASTRUCT结构
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData;//数据长度 PVOID lpData;//存放通信数据的内存的地址 } COPYDATASTRUCT, *PCOPYDATASTRUCT;
一个进程怎么可以访问另一个进程的内存地址呢?msdn有一句话:The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.
从这句话可见,我们不能传递是指针的数据,如果一个进程怎么可以访问另一个进程的内存地址的话,传指针数据有什么关系呢,这说明进程并不是直接访问另一个进程的内存地址,而是windows做了手脚,至于做了什么手脚,它可能使用了其他
比较底层的进程通信方式来实现,比如共享内存。认识到这一点,我们心里就有底了。