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;
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做了手脚,至于做了什么手脚,它可能使用了其他
比较底层的进程通信方式来实现,比如共享内存。认识到这一点,我们心里就有底了。