【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 ...
随机推荐
- HelloWorld程序的代码编写-Hello World的编译运行
HelloWorld程序的代码编写 程序开发步骤说明 开发环境已经搭建完毕,可以开发我们第一个Java程序了. Java程序开发三步骤:编写.编译.运行. 编写Java源程序 1. 在 d:\day0 ...
- Unity之详解Texture
[Texture]详解什么是Texture 前言 开篇废话 嗨咯大家好呀,时隔多日,小黑又和大家见面咯,最近懒癌犯了,而且技术上边倍受打击,所以回了家只想着睡觉休息,所以希望大家见谅见谅啦. Unit ...
- C++迭代器种类与编译期间多态
迭代器分类 C++ STL 中根据移动能力将迭代器分成了 5 类: Input Iterator 输入迭代器,只支持 operator++ 操作. Output Iterator 输出迭代器,只支持 ...
- JVM参数:带你认识-X和-XX参数
摘要:JVM参数分为三类:标准参数.非标准参数(-X参数)和高级选项(-XX参数).本文主要为大家讲解-X参数和-XX参数. 本文分享自华为云社区<JVM运行参数之-X和-XX参数>,作者 ...
- 如何在 C# 项目中链接一个文件夹下的所有文件
在 C# 项目中通过链接方式引入文件可以让我们在项目中使用这些文件中的代码.常见的比如链接 AssemblyInfo.cs 文件,这样我们就可以在项目中使用这个文件中的版本号等信息.但是如果我们想要链 ...
- DataX插件二次开发指南
一. DataX为什么要使用插件机制? 从设计之初,DataX就把异构数据源同步作为自身的使命,为了应对不同数据源的差异.同时提供一致的同步原语和扩展能力,DataX自然而然地采用了框架 + 插件 的 ...
- EPICS Archiver Appliance的定制部署2
EPICS Archiver Appliance的定制部署1 按上面的步骤Archiver可以跑起来了,试了一下,发现waveform不能archive,看服务状态: 看起来正常,怀疑在profile ...
- Ubuntu下的FTP Servers搭建与连接
1.安装FTP:vsftod sudo apt-get install vsftpd sudo: 使用sudo(super user do)给普通用户赋予权限 不是所有命令都能用sudo执行的,比 ...
- chatGPT帮助开发实战解答问题和反思
问题来自.Net开发群友 问题 我想做一个自动生成单据号的功能,但是在EFCORE里没有行级锁,请有什么等价方案吗? ChatGPT回答 在 EF Core 中确实没有提供行级锁(row-level ...
- Shapefile导入MySQL
1. 概述 Shapefile是常用的空间数据文件格式,MySQL是常用的关系型数据库 MySQL遵从OpenGIS联盟(OGC)的规范,MySQL实施了空间扩展,更详细的信息可以参考: MySQL ...