记录平时遇到的一些注意点

WM_COPYDATA注意点

typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

/********
注释:
1、dwData.为自定义数据;
2、cbData.即lpData指向的数据的长度,要是这个变量的值设置错误,就会导致WM_COPYDATA传输/*数据失败;
3、lpData.传输的数据.最好使用基础数据类型;
********/

使用WM_COPYDATA时要用SendMessage而不能使用PostMessage,因为SendMessage是阻塞的,会等待消息响应窗体处理消息完毕后再返回;而PostMessage是异步的,这样就可能会导致当消息响应窗体接收到WM_COPYDATA的时候,COPYDATASTRUCT对象已经被析构了,导致访问数据发生异常;

由于使用SendMessage,所以不应该在WM_COPYDATA中处理数据,可以在消息响应窗体的WM_COPYDATA中先把COPYDATASTRUCT对象中的数据复制出来,通过自定义消息发送到消息响应窗体,然后立即返回,来减少父进程的阻塞时间。这样就把处理数据的代

 case WM_COPYDATA:
    {
      COPYDATASTRUCT* data = (COPYDATASTRUCT*)lParam;
      // TODO: 处理pCopyData->lpData指向的数据
    }
    break;

你可能感兴趣的:(c++windows)