跨进程通信之WM_COPYDATA
2016-04-22 14:07
423 查看
一、MSDN提供:
#define WM_COPYDATA 0x004A
数据结构:
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT, *PCOPYDATASTRUCT;dwDataType: ULONG_PTRThe data to be passed to the receiving application.cbDataType: DWORDThe size, in bytes(此处我用红色标示,就是重要警告), of the data pointed to by the lpData member.lpDataType: PVOIDThe 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 );
相关文章推荐
- OpenCV之ml 模块. 机器学习:支持向量机(SVM)介绍 支持向量机对线性不可分数据的处理
- android真机调试时使用adb shell命令 windows
- OpenCV之objdetect 模块. 物体检测:级联分类器
- Linux ssh远程登录到另一台机器命令
- nginx配置
- Apache Karaf离线打包
- 如何让vim编辑器永久显示行号
- OpenCV之calib3d 模块. 相机定标和三维重建
- centos7 安装nfs报错
- Linux虚拟地址空间布局
- linux上挂载windows共享文件夹
- Ubuntu下载安装tomcat
- tomcat绑定域名
- Hadoop 2.6.4 在Ubuntu上的伪分布式集群的配置
- Linux下 开发工具和资源的位置
- LANMT架构搭建jspxcms
- java.lang.NoClassDefFoundError: org/apache/log4j/spi/NOPLoggerRepository
- Linux Kernel Release Versions
- 用OpenCV建立一幅只有几个像素且值可以自定义的图像,并输出保存到硬盘的方法!
- 技术架构学习笔记(八) 第三方支付架构原则(转)