WM_COPYDATA消息,在win32中用来进行进程间的数据传输。

typedef struct tagCOPYDATASTRUCT {  // cds
    DWORD dwData; DWORD cbData; PVOID lpData;
} COPYDATASTRUCT;

其中dwData为32位的自定义数据, lpData为指向数据的指针,cbData为lpData指针指向数据的大小(字节数)。

一般推荐用SendMessage函数进行发送,这样就能确保在接收方复制数据前避免发送方能修改或删除数据;

LRESULT SendMessage(HWND hWnd,      // handle of destination windowUINT Msg,       // message to sendWPARAM wParam,  // first message parameterLPARAM lParam   // second message parameter
);

这里:

hWnd:为接收进程的窗体句柄;

Msg:WM_COPYDATA;
wParam:为发送进程的窗体句柄;

lParam:为指向COPYDATASTRUCT数据结构的指针;

这里需要注意的:传输的COPYDATA数据在发送后要避免被发送进程中的其他线程修改,其次要确保被传输的数据中没有包含接收进程无法访问的对象的指针或引用。比如:发送进程自身的HDC、HBITMAP之类的东西,它们对于接收进程来说是无效的。另外,接收进程窗体句柄可以通过FindWindow函数获取:

const char szDlgTitle[] = "ReceiveProcess";
HWND hRecvWindow  = ::FindWindow(NULL, szDlgTitle);

这里的“ReceiveProcess”为接收进程的名字;

同时,接收数据的进程中,首先在消息映射表中增加WM_COPYDATA消息映射,然后定义消息映射函数,其函数的格式为:

BOOL CCanCollectorDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{....
}

主要代码如下:(这里发送进程发送当前的时间给接收进程)

发送进程:

void CProcessCommDlg::OnBTNStart1()
{const char szDlgTitle[] = "ReceiveProcess";  HWND hSendWindow =this->GetSafeHwnd();HWND hRecvWindow  = ::FindWindow(NULL, szDlgTitle); COPYDATASTRUCT CopyData; char szSendBuf[100];  time_t  timenow; time(&timenow);  sprintf(szSendBuf, "%s", ctime(&timenow));//注意,ctime()返回的字符串后面带了'\n'  CopyData.dwData = 0;  CopyData.cbData = strlen(szSendBuf);  szSendBuf[CopyData.cbData - 1] = '\0';  CopyData.lpData = szSendBuf;  ::SendMessage(hRecvWindow, WM_COPYDATA, (WPARAM)hSendWindow, (LPARAM)&CopyData);  printf("%s\n", szSendBuf);  }

接收进程:

BEGIN_MESSAGE_MAP(CCanCollectorDlg, CDialog)//{{AFX_MSG_MAP(CCanCollectorDlg)
    ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_COPYDATA()//}}AFX_MSG_MAP
END_MESSAGE_MAP()........BOOL CCanCollectorDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{char szBuffer[300];  memset(szBuffer, 0, sizeof(szBuffer));  sprintf(szBuffer, "dwData:%d cbData:%d\r\nlpData:0x%08x = %s\r\n\r\n",   pCopyDataStruct->dwData, pCopyDataStruct->cbData,   (PVOID)pCopyDataStruct->lpData, (char*)pCopyDataStruct->lpData);  return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

转载于:https://www.cnblogs.com/xiekeli/p/3994380.html

windows进程通信 -- WM_COPYDATA消息相关推荐

  1. python笔记 7-8 进程池 进程通信 迭代器 消息队列 Queue 协程 和正则表达式

    day7 进程 进程池 进程通信 迭代器 消息队列 Queue 作用 用于多个进程间的通信 操作put放入消息(值) put_nowait() 放入值,不等待 如果队满,则报错 get获取消息(值) ...

  2. 几种Windows进程通信

    32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护.那么相应的进程之间的通信也就有必要整理掌握一下. Windows进程间通讯的方法有很多:管道. ...

  3. Windows进程通信之PE文件共享节

    本文由danny发表于 http://blog.csdn.net/danny_share 说明:建议先下载本文配套工程,其中 SectionDLL.SectionMain工程.SectionASub工 ...

  4. Android service 和 client的进程通信和消息回调--AIDL

    2019独角兽企业重金招聘Python工程师标准>>> (一)项目介绍 Launcher上播放小视屏和独立的视频应用.小视屏是视频应用的裁剪版,只有播放的功能,两者使用相同的底层系统 ...

  5. Windows进程通信之共享内存通信(C++)

    首先是概念:https://baike.baidu.com/item/%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/2182364?fr=aladdin 这是比较官方的解释 ...

  6. Windows进程通信之剪贴板

    本文由danny发表于http://blog.csdn.net/danny_share 前面两篇废话了这么多,本文开始上干货. 本文从剪贴板概念.剪贴板内容监听,普通数据类型,打开剪贴板,读剪贴板,写 ...

  7. Windows进程通信——剪贴板

    1. 概述 1.1 介绍 剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切 ...

  8. Linux进程通信之消息队列

    目录 1.消息队列的原理: 2.消息队列的接口: (1)创建消息队列 (2)向消息队列发送消息 (3)接收消息 (4)操作消息队列的接口 1.消息队列的原理: 消息队列(messagequeue)以链 ...

  9. 用WM_COPYDATA消息来实现两个进程之间传递数据

    文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法: 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有   1.使用内存映 ...

最新文章

  1. CVPR2020中关于3D点云分割
  2. grub通过img文件启动linux,Linux GRUB实现双系统引导之菜鸟教程
  3. 自定义ConfigurationSection,创建多个嵌套的ConfigurationElementCollection节点
  4. Vuex与登录状态保存
  5. 天猫上线“商家售后服务评价”功能,消费者体验将纳入商家考核指标
  6. python 点云配准_点云配准(Registration)算法——以PCL为例
  7. Sass mixin与extends、%placeholder、function
  8. CI框架取消index.php
  9. oracle收发邮件存储过程
  10. 【C#桌面应用】第一节:使用C#开发桌面应用的准备
  11. 让你不富都难的28个理财习惯
  12. java时间往后一天_如何在Java中将日期增加一天?
  13. JS---Math.Random()*10--[0,10)随机变颜色
  14. java8 streamlist转化
  15. 模拟经营游戏框架构思
  16. meta-inf java_jar包中的META-INF 文件夹是干嘛的?
  17. stm32摄像头调试 | 串口传输照片数据 | 用python来设计上位机通信软件
  18. Error500错误的解决方法(俩种解决方法)
  19. linux中目录前 表示什么意思,linux的命令行前面的root@linux~ #中的每个部分代表什么意思?...
  20. linux用c实现pwd命令,linux pwd指令的C实现

热门文章

  1. python回归模型 变量筛选_如何进行高维变量筛选和特征选择(一)?Lasso回归
  2. word中公式编辑器编号
  3. 空间数据挖掘的主要方法总结
  4. 计算机网络校园网建设设计摘要,计算机网络专业论文校园网建设设计.doc
  5. system函数阻塞_CompletableFuture:让你的代码免受阻塞之苦
  6. webpack 图片压缩不起作用_理论|webpack2 终极优化
  7. bom event周期_前端知识点总结——BOM
  8. echart 折线图设置y轴单位_如何让echarts中y轴的单位位于数值的右上角
  9. 7月清北学堂培训 Day 5
  10. import Vue form 'vue’的意思