這裏轉載了一位同學對WM_COPYDATA的總結,寫的不錯,我基本沒有修改。
COPYDATASTRUCT有三個成員變量,如下所示:
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
注意:
1、dwData爲自定義數據,按照自己習慣設置就好,不影響對象的傳輸;
2、cbData,MSDN解釋爲:The size, in bytes, of the data pointed to by the lpData member.即lpData指向的數據的長度,要是這個變量的值設置錯誤,就會導致WM_COPYDATA傳輸數據失敗;
3、lpData,傳輸的數據。使用簡單的數據最好,例如char數組。
4、使用WM_COPYDATA時要用SendMessage而不能使用PostMessage,因爲SendMessage是阻塞的,會等待消息響應窗體處理消息完畢後再返回;而PostMessage是異步的,這樣就可能會導致當消息響應窗體接收到WM_COPYDATA的時候,COPYDATASTRUCT已經內存已經被釋放,導致訪問數據發生異常;
5、由於使用SendMessage,所以不應該在WM_COPYDATA中處理數據,可以在消息響應窗體的WM_COPYDATA中先把COPYDATASTRUCT對象中的數據複製出來,通過自定義消息發送到消息響應窗體,然後立即返回,來減少父進程的阻塞時間。這樣就把處理數據的代碼放在自定義消息處了。
WM_COPYDATA消息響應的處理代碼例子如下:
case WM_COPYDATA:
{
COPYDATASTRUCT *pCopyData = reinterpret_cast<COPYDATASTRUCT *>(lParam);
if (pCopyData != NULL)
{
// TODO: 處理pCopyData->lpData指向的數據
}
}
break;