WM_COPYDATA 注意事項

這裏轉載了一位同學對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;


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章