【windows】 进程间通信 WM_COPYDATA消息
WM_COPYDATA消息可以实现window应用程序之间的数据传输,是同步传输方式。
需要用到结构体 COPYDATASTRUCT
typedef struct tagCOPYDATASTRUCT {
DWORD dwData; //32位自定义的数据
DWORD cbData; // lpData指针指向的数据的大小,单位字节
PVOID lpData; //指向数据的指针,要传输的数据
} COPYDATASTRUCT;
一般使用 SendMessage()函数发送消息,不使用PostMessage(),可以确保在接收方复制数据前比秒发送方修改或删除数据。
LRESULT SendMessage(
HWND hWND, //接收进程的窗体句柄
UINT Msg, //发送的消息 WM_COPYDATA
WPARAM wParam, //发送进程的窗体句柄
LPARAM lParam, //指向COPYDATASTRUCT数据结构的指针
};
要注意的是 1、 lParam不能为空;2、lParam不包含接收进程无法访问的对象的指针或引用,比如发送进程自身的HDC、HBITMAP之类的东西。
如果知道接收进程的名字,可以使用FindWindow()函数获取接收进程窗体句柄。
示例:创建两个MFC对话框程序,sendAPP发送时间,receiveAPP接收时间,主要代码如下:
//sendAPP添加一个按钮,添加按钮click处理事件:
//sendAPPDlg.cpp
void CsendAPPDlg::OnBnClickedButtonsendmessage()
{
// TODO: 在此添加控件通知处理程序代码
LPCWSTR szReceiveDlgTitle = L"receiveAPP";
HWND hSendWindow = this->GetSafeHwnd();
HWND hReceiveWindow = ::FindWindow(NULL, szReceiveDlgTitle); COPYDATASTRUCT copyData;
char szSendBuf[MAX_PATH];
time_t timeNow;
time(&timeNow);
sprintf_s(szSendBuf, "%s", ctime(&timeNow));
copyData.dwData = 0;//32位自定义数据
copyData.cbData = strlen(szSendBuf);//lpData指针指向数据的大小,单位字节
szSendBuf[copyData.cbData ] = '\0';
copyData.lpData = szSendBuf;//指向数据的指针,就是你要传输的数据 //第一个参数 hWnd:接收进程的窗体句柄
//第二个参数 Msg:消息类型
//第三个参数 wParam:发送进程的窗体句柄
//第四个参数 lParam:指向COPYDATASTRUCT数据结构体的指针
::SendMessage(hReceiveWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)©Data); printf("%s\n", szSendBuf);
}
//receiveAPP添加 WM_COPYDATA消息处理函数
//receiveAPPDlg.cpp
BOOL CreceiveAPPDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
char szBuffer[300];
memset(szBuffer, 0, sizeof(szBuffer));
sprintf(szBuffer, "dwData:%d\ncbData:%d\nlpDdata:0x%08x = %s\n",
pCopyDataStruct->dwData, pCopyDataStruct->cbData,
(PVOID)pCopyDataStruct->lpData, (char*)pCopyDataStruct->lpData); SetDlgItemText(IDC_STATIC_Show, szBuffer);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
运行两个exe,点击发送数据,receiveAPP会显示当前时间

总结:
实现两个进程间同步通信,传输较少数据量
1.sendMessage()发送消息; 发送方
2.onCopyData()消息处理函数处理消息。 接收方
发送方和接收方可以是同一个,可以使用FindWindow()函数获取已知窗口名字的窗体句柄。

参考:https://www.cnblogs.com/xiekeli/p/3994380.html
【windows】 进程间通信 WM_COPYDATA消息的更多相关文章
- 利用WM_COPYDATA消息实现进程间通信
进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现. 发送WM_COPYDATA消息: SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM) ...
- windows进程通信 -- WM_COPYDATA消息
WM_COPYDATA消息,在win32中用来进行进程间的数据传输. typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbD ...
- [转]Windows进程间通信的各种方法
http://www.cnblogs.com/songQQ/archive/2009/06/03/1495764.html 道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包) ...
- windows进程间通信 .
摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microso ...
- Windows进程间通信的各种方法
原文:Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线程是Windows操作系 ...
- Windows进程间通信(下)
六.动态数据交换(Dynamic Data Exchange) 动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式.应用程序可以使用DDE进行一次性数据传输,也可以当出 ...
- 用WM_COPYDATA消息来实现两个进程之间传递数据
文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法:在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有 1.使用内存映射 ...
- WINDOWS特有的消息常量标识符
'========================================'WINDOWS特有的消息常量标识符'======================================== ...
- VC++ 在两个程序中 传送字符串等常量值的方法:使用了 WM_COPYDATA 消息(转载)
转载:http://www.cnblogs.com/renyuan/p/5037536.html VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的 消息作用: ...
- VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
消息作用: 在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT { ULONG_PTR dw ...
随机推荐
- CSS中的各种格式化上下文-FC(BFC)、IFC、GFC、FFC)
什么是FC? FC是Formatting Context的缩写,中文名:格式化上下文.是 W3C在CSS2.1 规范中的一个概念. FC是指页面中一篇渲染区域,渲染区域内使用的格式化上下文的渲染规则, ...
- 【一句话】Java8后abstract class和interface的区别
首先一句话: Java8后(1)interface支持default和static方法有实现,abstract class依然是抽象方法和非抽象方法,(2)可同时实现多个interface,(3)但成 ...
- 从零开始,打造属于你的 ChatGPT 机器人!
大家好!我是韩老师. 不得不说,最近 OpenAI/ChatGPT 真的是太火了. 前几天,微软宣布推出全新的 Bing 和 Edge,集成了 OpenAI/ChatGPT 相关的技术,带动股价大涨: ...
- Creo9.0 安装破解图文教程 【2022年12月29日亲测有效】
前言 creo9.0正式版是一款非常优秀的3D建模设计软件.该软件界面美观,提供了CAD 技术.模制造绘图.多实体建模.多体设计.实时仿真.框架和焊缝设计等一系列强大的辅助设计功能,通过这些功能,让用 ...
- SpringCloud GateWay网关(入门)
1.介绍 强烈推荐,看官网文档 Spring Cloud Gateway ①简介 Cloud全家桶里有个重要组件:网关 SpringCloud Gateway基于WebFlux框架 WebFlux底层 ...
- ubuntu16.04安装ROS+cartographer
使用张明明大神修改编译版 注意:中间出过很多错误,大部分是开源包eigen,protobuf的版本与该SLAM不匹配. 之前装了eigen的,删掉.protobuf我装的是3.6.1 1.安装依赖性: ...
- 修改Element - plus的样式
把显示再浏览器上的对应css选择器全部写上,并且添加 !important </script> <style lang='scss' scoped> //修改 element ...
- 【Go语言基础】slice
一.概述 数组(Array)的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本. 显然这种数据结构无法完全满足开发者的真实需求.Go语言提供了数组切片(slice)来弥补数组的不足. ...
- 2023.2.26【模板】扩展Lucas定理
2023.2.26[模板]扩展Lucas定理 题目概述 求\(\binom {n}{m} mod\) \(p\) 的值,不保证\(p\)为质数 算法流程 (扩展和普通算法毫无关系) 由于\(p\)不是 ...
- SSM框架学习-AOP学习笔记
一.AOP入门简介 AOP(Aspect Oriented Programming)面向切面编程,是一种编程范式,可以知道开发者如何组织程序结构 作用:在不惊动原始设计的基础上为其进行功能增强.(无侵 ...