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; /*給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做了手腳,至於做了什麼手腳,它可能使用了其他
比較底層的進程通信方式來實現,比如共享內存。認識到這一點,我們心裏就有底了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章