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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈进程间的消息传递

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

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

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

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)&copyData);? // 不能使用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;

}

即收到該消息后從相應參數取出數據進行處理。

學累了吧,快來看看我的非技術博客:貓思貓想


總結

以上是生活随笔為你收集整理的浅谈进程间的消息传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。