天天看點

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做了手腳,至于做了什麼手腳,它可能使用了其他      
比較底層的程序通信方式來實作,比如共享記憶體。認識到這一點,我們心裡就有底了。      

繼續閱讀