天天看点

WM_COPYDATA的实现原理

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

继续阅读