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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

通过WM_COPYDATA消息完成进程间通信

發(fā)布時間:2024/4/11 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过WM_COPYDATA消息完成进程间通信 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通過WM_COPYDATA消息完成進(jìn)程間通信

完成進(jìn)程間通信最簡單的方式就是發(fā)送WM_COPYDATA消息。

(1)發(fā)送WM_COPYDATA消息

SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)發(fā)送窗口句柄, (LPARAM)&copyData);

其中的copyData是要發(fā)送的數(shù)據(jù),類型為COPYDATASTRUCT結(jié)構(gòu)體:

typedef struct tagCOPYDATASTRUCT

{?

DWORD dwData;??

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT;

?

dwData : Specifies up to 32 bits of data to be passed to the receiving application.

cbData : Specifies the size, in bytes, of the data pointed to by the lpData member.

lpData : Long pointer to data to be passed to the receiving application. This member can be NULL.

該消息只能由SendMessage()發(fā)送,而不能使用PostMessage()。因?yàn)橄到y(tǒng)必須管理用以傳遞數(shù)據(jù)的緩沖區(qū)的生命期,如果使用了PostMessage(),數(shù)據(jù)緩沖區(qū)會在接收方(線程)有機(jī)會處理該數(shù)據(jù)之前,就被系統(tǒng)清除和回收。

如果傳入的接收窗口句柄無效或者當(dāng)接收方進(jìn)程意外終止時,SendMessage()會立即返回,發(fā)送方不會陷入一個無窮等待的狀態(tài)中。

此外還需注意:

1.所發(fā)送的數(shù)據(jù)不能包含數(shù)據(jù)接收方無法訪問的指針或?qū)ο笠?#xff09;

2.消息發(fā)送后,要保證lpData所引用數(shù)據(jù)不能被其它線程修改(直到SendMessage函數(shù)返回))

示例代碼片段(MFC):

HWND receiveWindow = ::FindWindow(NULL, "CopyDataReceiver"); if (receiveWindow == NULL) return; CString sendData; GetDlgItemText(IDC_EDIT_SEND, sendData);COPYDATASTRUCT copyData = { 0 }; copyData.lpData = sendData.GetBuffer(); copyData.cbData = sendData.GetLength();::SendMessage(receiveWindow, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copyData);sendData.ReleaseBuffer();

(2)接收WM_COPYDATA消息:

WM_COPYDATA

wParam = (WPARAM)(HWND) hwnd;

lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

lParam包含了接收到的數(shù)據(jù),在處理之前需要將類型轉(zhuǎn)換為COPYDATASTRUCT結(jié)構(gòu)體。接收方應(yīng)認(rèn)為這些數(shù)據(jù)是只讀的,并且只在處理該消息的過程中有效。如果想修改這些數(shù)據(jù),應(yīng)該把它們復(fù)制到本地buffer。

由于發(fā)送方在接收方處理WM_COPYDATA消息完畢前都是處于等待(SendMessage阻塞)中,所以接收方應(yīng)當(dāng)盡快處理WM_COPYDATA消息。

示例代碼片段(MFC):

BOOL CCopyDataReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) {if (pCopyDataStruct->cbData > 0){char recvData[256] = {0} ;strncpy(recvData, (char *)pCopyDataStruct->lpData, pCopyDataStruct->cbData);SetDlgItemText(IDC_EDIT_RECEIVE, (char *)recvData);}return CDialog::OnCopyData(pWnd, pCopyDataStruct); }

總結(jié)

以上是生活随笔為你收集整理的通过WM_COPYDATA消息完成进程间通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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