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