關於WM_COPYDATA的使用總結

windows進程間通信的方法有很多,詳細請查看:https://www.cnblogs.com/findumars/p/6329593.html

本人最近在項目中使用了WM_COPYDATA來作爲進程間通信的方式,於是就有了這篇總結博客。

首先,關於WM_COPYDATA的介紹可以查看:https://docs.microsoft.com/zh-cn/windows/win32/dataxchg/wm-copydata。在上述網頁中可以看到:lParam,A pointer to a COPYDATASTRUCT structure that contains the data to be passed。也就是說會在WM_COPYDATA消息響應函數的LPARAM參數中傳遞COPYDATASTRUCT對象,COPYDATASTRUCT的結構可以查看:https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/ns-winuser-copydatastruct

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數組。本人在程序中使用了string對象,發現在子進程不能接收到正常的數據,使用char數組卻很正常。有可能跟string對象不能跨進程訪問有關,讀者如果知道原因的話請在評論區告訴我,謝謝;

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;

以上就是我對WM_COPYDATA的使用總結。WM_COPYDATA注意事項不多,還是挺簡單實用的。本人限於能力,上文中難免有錯誤的地方,若讀者發現上文的錯誤,請於評論區中指出,本人看到之後會立即修改的,謝謝。

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