1. 程式人生 > >c++程序間通訊 為什麼不能用PostMessage傳遞指標資料

c++程序間通訊 為什麼不能用PostMessage傳遞指標資料

1.程序A呼叫CreateFileMapping建立一個記憶體對映檔案。


2.程序A呼叫MapViewOfFile獲取到對映到檔案的記憶體起始地址,呼叫memcpy往記憶體中拷貝資料。


3.程序B呼叫CreateFileMapping開啟程序A建立的記憶體對映檔案。


4.程序B呼叫MapViewOfFile獲取到對映到檔案的記憶體起始地址,呼叫memcpy從記憶體中讀出資料。


5.通訊完後進程A,B分別呼叫UnmapViewOfFile,CloseHandle取消記憶體對映和關閉記憶體對映物件控制代碼。


用訊息來實現,比較簡單。
有兩種方式,一種是採用WM_COPYDATA訊息,這個是專門用來進行程序通訊的,可以發一個整塊記憶體的指標過去,用SendMessage或
者SendMessageTimeout的方式;
  pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);//注意這裡不能用PostMessage,因其是非同步函式,接收端不管有沒有收到 都會返回

注意postemessage

跨程序傳地址無效,故程序間傳指標資料以下兩種是不行的

PostMessage傳送後直接返回,然後在接受程序未取出資料之前,資料可能就已經被銷燬,指標的值可能已經改變

SendMessage()函式,接收方在資料複製完成前不返回,這樣傳送方就不可能刪除和修改資料。

另一種是廣播視窗訊息,比如兩邊都定義UINTg_uMsgBkChanged = ::RegisterWindowMessage( SYSTEM_MSG_BG_CHANGED);

然後以g_uMsgBackgroundChanged 為訊息傳送,不過這種只能傳送包含wParam和lParam兩個相當於是int型大小的資訊過去

::PostMessage( HWND_BROADCAST, g_uMsgBackgroundChanged, m_nBgIndex, 0);   //廣播視窗訊息

也可以向指定視窗傳送自定義訊息

#define MSG_BT_SETTINGS_CHANGE       (WM_USER + 1000)

int m_nBtSettings = 0;  //有32個bit 資料位使用

::PostMessage(m_wnd,  MSG_BT_SETTINGS_CHANGE, 0, m_nBtSettings);