c++程序間通訊 為什麼不能用PostMessage傳遞指標資料
阿新 • • 發佈:2019-01-23
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,因其是非同步函式,接收端不管有沒有收到 都會返回
跨程序傳地址無效,故程序間傳指標資料以下兩種是不行的
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()函式,接收方在資料複製完成前不返回,這樣傳送方就不可能刪除和修改資料。
然後以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);