通过WM_COPYDATA消息完成进程间通信

完成进程间通信最简单的方式就是发送WM_COPYDATA消息。

(1)发送WM_COPYDATA消息

SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&copyData);

其中的copyData是要发送的数据,类型为COPYDATASTRUCT结构体:

typedef struct tagCOPYDATASTRUCT

{

DWORD dwData;

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT;

dwData : Specifies up to 32 bits of data to be passed to the receiving application.

cbData : Specifies the size, in bytes, of the data pointed to by the lpData member.

lpData : Long pointer to data to be passed to the receiving application. This member can be NULL.

该消息只能由SendMessage()发送,而不能使用PostMessage()。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之前,就被系统清除和回收。

如果传入的接收窗口句柄无效或者当接收方进程意外终止时,SendMessage()会立即返回,发送方不会陷入一个无穷等待的状态中。

此外还需注意:

1.所发送的数据不能包含数据接收方无法访问的指针或对象引用)

2.消息发送后,要保证lpData所引用数据不能被其它线程修改(直到SendMessage函数返回))

示例代码片段(MFC):

HWND receiveWindow = ::FindWindow(NULL, "CopyDataReceiver");
if (receiveWindow == NULL)  return; CString sendData;
GetDlgItemText(IDC_EDIT_SEND, sendData);COPYDATASTRUCT copyData = { 0 };
copyData.lpData = sendData.GetBuffer();
copyData.cbData = sendData.GetLength();::SendMessage(receiveWindow, WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)&copyData);sendData.ReleaseBuffer();

(2)接收WM_COPYDATA消息:

WM_COPYDATA

wParam = (WPARAM)(HWND) hwnd;

lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

lParam包含了接收到的数据,在处理之前需要将类型转换为COPYDATASTRUCT结构体。接收方应认为这些数据是只读的,并且只在处理该消息的过程中有效。如果想修改这些数据,应该把它们复制到本地buffer。

由于发送方在接收方处理WM_COPYDATA消息完毕前都是处于等待(SendMessage阻塞)中,所以接收方应当尽快处理WM_COPYDATA消息。

示例代码片段(MFC):

BOOL CCopyDataReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{if (pCopyDataStruct->cbData > 0){char recvData[256] = {0} ;strncpy(recvData, (char *)pCopyDataStruct->lpData, pCopyDataStruct->cbData);SetDlgItemText(IDC_EDIT_RECEIVE, (char *)recvData);}return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

通过WM_COPYDATA消息完成进程间通信相关推荐

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

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

  2. windows进程通信 -- WM_COPYDATA消息

    WM_COPYDATA消息,在win32中用来进行进程间的数据传输. typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbD ...

  3. 发送WM_COPYDATA消息实现进程间的通信

    mark一下 结构体 struct Info{ TCHAR g_strFileType[MAX_PATH]; bool bStop; }; 这是发送端的进程 HWND hWndRcv=::FindWi ...

  4. Qt:Qt使用WM_COPYDATA消息进行进程通信

    Qt使用WM_COPYDATA消息进行进程通信 如题,Qt使用WM_COPYDATA消息进行进程通信,这次我们使用windows相关api,来实现不同的 Qt窗口进程间的通信,使用的window的 W ...

  5. VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的

    消息作用:     在进程间共享数据(内部通过创建内存映射文件) 消息介绍: 需要用到的数据结构/类型: typedef struct tagCOPYDATASTRUCT {     ULONG_PT ...

  6. 使用WM_COPYDATA消息在不同进程间或窗口间通信传递数据

    WM_COPYDATA消息类型属于windows系统标准消息类型,主要用于进程间或不同窗口间进行信息传递,使用此消息的同时在接收端需要重写窗口的消息处理函数DefWndProc,以便读取消息内容. 为 ...

  7. win32下进程间通信方式之管道、邮件槽、剪切板、共享内存、消息、套接字、RPC、DDE等

    #include "stdafx.h"/*32位Windows采用虚拟内存技术使每个进程虚拟4G内存,在逻辑上实现了对进程之间数据代码的分离与保护.那么相应的进程之间的通信也就有必 ...

  8. 【进程】进程间通信----消息队列

    文章目录 1.消息队列 2.特性 3.实现接口 4.消息队列进程间通信 5.消息队列和命名管道的区别 5.1 相同之处 5.2 消息队列的优势 6.消息队列组织图 1.消息队列 消息队列,就是一个消息 ...

  9. [Win]进程间通信——邮槽Mailslot

    进程间通信 进程的地址空间是私有的.出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义.但是在一些具体的应用情况下需要多个进行相互配合 ...

最新文章

  1. Entity Framework 学习笔记(1)
  2. 微信小程序 时间操作
  3. Cannot add or update a child row:
  4. filebeat+elk简单搭配
  5. python 基础 列表
  6. 数据库优化:8 种常见的SQL错误用法
  7. 【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库
  8. 讨论帖:比特币中的SHA256算法的实现与标准的SHA256算法实现是否相同?
  9. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别
  10. P4行为模型BMV2依赖关系安装:thrift nanomsg nnpy安装
  11. 开学了,一切都要开始了!
  12. 终于,我们的新产品Fotor Slideshow Maker上线了!!
  13. 转载AWS 基础知识
  14. Java 开发必备,EasyExcel 操作详解!
  15. printf linux 头文件,printf()函数 [转]linux调用动态库so文件(2)
  16. Android 常用开发工具以及Mac常用软件
  17. DMS - 简介 Driver Monitor System
  18. 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
  19. hardcore团队misc
  20. 基于Python实现的实时聊天系统

热门文章

  1. SpringBoot_入门-课程简介
  2. Java语法糖之foreach
  3. Fork_Join - Java多线程编程
  4. java存储三元组_在4store中添加三元组
  5. Java 中的某些方法为什么要求传入一个 Class 对象
  6. 让你不再害怕指针的应用-全程仿真+注解(第一部分:变量)
  7. spring boot application.properties 属性详解
  8. 圆方圆python入门:如何学习(二)
  9. Factory Method模式的误区:Factory Method模式是简化版的Abstract Factory吗?
  10. Android角落 不妨再看LinearLayout