跨进程通信之WM_COPYDATA

本文详细介绍了Windows消息WM_COPYDATA的使用,包括MSDN提供的官方说明,具体的使用步骤,以及在实现跨进程通信时需要注意的事项。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

一、MSDN提供:

#define WM_COPYDATA                     0x004A
数据结构:
typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
dwData

Type: ULONG_PTR

The data to be passed to the receiving application.

cbData

Type: DWORD

The size, in bytes(此处我用红色标示,就是重要警告), of the data pointed to by the lpData member.

lpData

Type: PVOID

The data to be passed to the receiving application. This member can be NULL.


二、使用方法:

操作系统对该消息做了特殊处理。
1.只能使用SendMessage(不能使用PostMessage),阻塞,等待bool OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)执行后返回,故可以发送局部指针变量;
2.::SendMessage(hWnd,WM_COPYDATA,NULL(该参数为发送端窗口句柄),(LPARAM)&dsSend(该参数为COPYDATASTRUCT*));

三、注意:

1.使用WCHAR*的时候,cbData不是WCHAR的个数,而是:sizeof(WCHAR)*(wcslen(str)+1) 解析:宽字符串的字节长度+‘\0’;
2.如果是发送结构体,成员变量是CString 或者LPWSTR等都是不合适的(除非自己计算sizeof),使用固定长度的char型数组,会使代码可读性,及效率上更好。

3.该消息与Clipborad不同,不是共享内存的,可以通过比较发送端首地址、接收端首地址发现并不一样。只是跨进程做了一个内存拷贝。所以cbData的值一定不能小于其实际sizeof的值,否则,接收端接收到的指针解析不出来。

而且MSDN中的事例:
// ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
   char  s1[80];
   char  s2[80];
   DWORD n;
} MYREC;
COPYDATASTRUCT MyCDS;
MYREC MyRec;
HRESULT hResult;
BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
// ************ Code fragment ****************
// Get data from user. InfoDlgProc stores the information in MyRec.
//
   DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
//
// Copy data into structure to be passed via WM_COPYDATA.
// Also, we assume that truncation of the data is acceptable.
//
   hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
   if (hResult != S_OK)
   		return False;
   hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
   if (hResult != S_OK)
   		return False;
   MyRec.n = nAge;
//
// Fill the COPYDATA structure
// 
   MyCDS.dwData = MYPRINT;          // function identifier
   MyCDS.cbData = sizeof( MyRec );  // size of data
   MyCDS.lpData = &MyRec;           // data structure
//
// Call function, passing data in &MyCDS
//
   hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
   if( hwDispatch != NULL )
      SendMessage( hwDispatch,
                   WM_COPYDATA,
                   (WPARAM)(HWND) hWnd,
                   (LPARAM) (LPVOID) &MyCDS );
   else
      MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );









开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值