浅谈进程间的消息传递
From: http://blog.csdn.net/handsomewang527/article/details/1676259
??? 隨著我們開發(fā)的應(yīng)用的日益復(fù)雜,像以往那樣將所有功能坐在一個exe文件中情況越來越少,更多時候是整個應(yīng)用由若干模塊、甚至若干單獨(dú)的exe文件組成,這就涉及到了模塊或進(jìn)程間的通訊交互問題,本文主要談?wù)勗谶M(jìn)程間的信息傳遞方法,作為進(jìn)一步探討進(jìn)程間通訊方案的參考。
1.使用用戶自定義消息在進(jìn)程間傳遞消息。
?????? 經(jīng)過一定時間的Win32開發(fā),大家對Windows Mobile平臺下的消息映射機(jī)制應(yīng)該都比較清楚了,除了系統(tǒng)已經(jīng)為我們設(shè)定的如WM_CREATE、WM_PAINT這類消息外,還有一種特殊的WM_USER消息用于用戶自定義消息。
定義格式如下:
?????? #define WM_IAMHANDSOME WM_USER+1?????????????????
然后同樣的對于WM_IAMHANDSOME同樣的將它映射到相應(yīng)的處理函數(shù)上去。
當(dāng)需要使用激發(fā)該消息時,采用SendMessage函數(shù)發(fā)送一個WM_IAMHANDSOME即可。下面談?wù)勗谶M(jìn)程間如何進(jìn)行用戶自定義消息的傳遞。
?
?????? 例,假設(shè)兩個程序,一個叫zoujielun,一個叫feiyuqing,兩個程序進(jìn)行一項(xiàng)操作,唱一首名叫《千里之外》的歌。
?????? 其中即需要一個程序“唱”完后通知另一個程序接著“唱”。
1)在兩個程序中都定義#define WM_YOUTURN WM_USER+10
2)在feiyuqing進(jìn)程中加入對應(yīng)WM_YOUTURN的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
?????? //……
{WM_YOUTURN,OnYouturn},
?????? //……
};
3)在zoujielun中向feiyuqing發(fā)送WM_YOUTURN的消息,代碼如下:
?????? Sing(_T(“屋檐如懸崖風(fēng)鈴如滄海我等燕歸來……”));
?????????? HWND findWindows=NULL;
?????? findWindows= FindWindow(_T(“feiyuqing”), _T(“feiyuqing"));
?????????? SendMessage(findWindows,WM_YOUTURN,0,0);
這樣,即把消息發(fā)送給了feiyuqing進(jìn)程。
4)在feiyuqing中,對應(yīng)的OnYouTurn做出相應(yīng)處理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
?????? Sing(_T(“我送你離開千里之外 ……”));
?????? return 0;
}
??? 這樣即實(shí)現(xiàn)了進(jìn)程間通過自定義消息傳遞來進(jìn)行通訊,但是這樣的缺點(diǎn)是不能同時傳遞數(shù)據(jù)。假設(shè)feiyuqing因?yàn)槟昙o(jì)大了,如果突然“失憶”了,不記得歌詞,需要zoujielun不但告訴他該唱了,還要告訴他該唱什么,這時就需要利用系統(tǒng)一個強(qiáng)大的消息WM_COPYDATA。?
?
2.使用WM_COPYDATA消息跨進(jìn)程傳遞數(shù)據(jù)
?????? 在SDK中,該消息對應(yīng)的參數(shù)為:
??? WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;? ?????????????lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;
關(guān)鍵在于第二個參數(shù),即一個COPYDATASTRUCT結(jié)構(gòu)的指針。
該數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)如下:
typedef struct tagCOPYDATASTRUCT {
? DWORD dwData;
? DWORD cbData;
? PVOID lpData;
} COPYDATASTRUCT;
第一個數(shù)據(jù)成員可以傳遞一個DWORD類型,如果只是要在進(jìn)程間傳一個DWORD類型的數(shù)據(jù),這里可以直接用這個成員傳遞。
關(guān)鍵在第二、三個數(shù)據(jù)成員,第三個lpData即為欲傳遞的數(shù)據(jù)的指針,第二個cbData即為傳遞的數(shù)據(jù)大小,以byte為單位。
下面舉例,還是zoujielun和feiyuqing程序間的通訊。
1)在feiyuqing進(jìn)程中加入對應(yīng)WM_COPYDATA的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
?????? //……
{WM_COPYDATA,OnYouturn},
?????? //……
};
2)在zoujielun中向feiyuqing發(fā)送WM_YOUTURN的消息,代碼如下:
?????? Sing(_T(“屋檐如懸崖風(fēng)鈴如滄海我等燕歸來……”));
???? HWND findWindows=NULL;
?????? findWindows= FindWindow(_T(“feiyuqing"), _T(“feiyuqing"));
?????? TCHAR *sContent = new TCHAR[256];
?????? wsprintf(sContent,_T(“我送你離開千里之外……"));
COPYDATASTRUCT copyData;
copyData.cbData = _msize(sContent);
copyData.lpData = sContent;
SendMessage(findWindows,WM_COPYDATA,0,(LPARAM)©Data);? // 不能使用PostMessage,因?yàn)檫@是個非阻塞的函數(shù),對方會收不到發(fā)來的消息的。
3)在feiyuqing中,對應(yīng)的OnOnYouTurn做出相應(yīng)處理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
?????? TCHAR *sContent = NULL;
??????????? sContent? =(TCHAR*)((COPYDATASTRUCT*)lParam)->lpData;
?????? Sing(sContent);
?????? return 0;
}
即收到該消息后從相應(yīng)參數(shù)取出數(shù)據(jù)進(jìn)行處理。
學(xué)累了吧,快來看看我的非技術(shù)博客:貓思貓想
總結(jié)
以上是生活随笔為你收集整理的浅谈进程间的消息传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [摘]全文检索引擎Solr系列—–全文检
- 下一篇: 王道考研系列 计算机考研 ——机试指南(