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