日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈进程间的消息传递

發(fā)布時間:2023/12/9 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈进程间的消息传递 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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_CREATEWM_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為單位。

下面舉例,還是zoujielunfeiyuqing程序間的通訊。

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)&copyData);? // 不能使用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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。