【IPC进程间通信之四】数据复制消息WM_COPYDATA

IPC进程间通信+数据复制消息WM_COPYDATA

        IPC(Inter-Process Communication,进程间通信)。

        数据复制消息WM_COPYDATA是Windows中一个特殊的消息,通过这个消息能够在进程间传递数据。

       1.WM_COPYDATA:

        WM_COPYDATA消息含两个參数WPARAM
wParam和LPARAM  lParam。WPARAM和LPARAM是匈牙利命名法,历史更迭,WPARAM指32位整形变量,LPARAM指32为整形变量指针。发送WM_COPYDATA时,wParam赋值为发送此消息的窗体。lParam则指向一个COPYDATASTRUCT结构

       typedef
struct{

                ULONG_PTR
  dwData;

                DWOED   cdData;

                PVOID   lpData;

        };

        该结构体中。dwData能够使随意值,lpData是须要发送给窗体所在进程的数据地址,cbData是lpData发送数据的字节数。

       
在发送WM_COPYDATA消息时,系统会把COPYDATASTRUCT及lpData指向的内容发送给目标进程。目标进程接收到WM_COPYDATA消息后。能够从lParam參数中提取出数据。

         2.WM_COPYDATA发送端:

         创建窗体  ->   填充COPYDATASTRUCT   ->   SendMessage发送WM_COPYDATA数据。

         COPYDATASTRUCT cds;            //定义COPYDATASTRUCT变量

         

         SendMessage(

                  hwndto,
                                //目标窗体句柄

                 
(UINT)WM_COPYDATA,      //指定发送的数据

                 
(WPARAM)hwndfrom,         //将源窗体句柄做WPARAM參数

                 
(LPARAM)&cds                    //将COPYDATASTRUCT做LPARAM參数

         );

         3.WM_COPYDATA接收端:

        

         通过lPrama參数获取COPYDATASTRUCT  ->  从COPYDATASTRUCT中提取数据。

         COPYDATASTRUCT  *PointCds = (COPYDATASTRUCT *)lParam;

         PointCds->lpData则是传输的数据。

 4.牛刀小试:

因为測试程序涉及到窗体创建。较为复杂,附上project文件:

        发送端:点击下载

        接收端:点击下载

       上诉程序编译环境均为VS 2012

       上诉程序參考了《精通 Windows API》一书。

时间: 2024-08-04 08:02:29

【IPC进程间通信之四】数据复制消息WM_COPYDATA的相关文章

Linux环境编程之IPC进程间通信(五):Posix消息队列1

对于管道和FIFO来说,必须应该先有读取者存在,否则先有写入者是没有意义的.而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每个消息都是一个记录,它由发送者赋予一个优先级.在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达.消息队列是随内核的持续性,一个进程可以往某个队列写入一些消息,然后终止,再让另外一个进程在以后的某个时刻读出这些消息.这跟管道和FIFO不一样,当一个管道或FIFO的最后一次关闭时

嵌入式 Linux进程间通信(七)——消息队列

嵌入式 Linux进程间通信(七)--消息队列 一.消息队列 消息队列用于同一台机器上的进程间通信,是一个在系统内核中用来保存消息的队列,在系统内核中是以消息链表的形式出现.消息链表中节点的结构用msg声明.消息队列是一种从一个进程向另一个进程发送数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.消息队列可以避免命名管道的同步和阻塞问题,但是每个数据块都有一个最大长度的限制. 1.msgget函数 #include <sys/types.h> #in

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期

Linux环境编制之IPC进程间通信(一):IPC概述

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是"公共场所",所以内核显然可以提供这样的条件.除此以外,那就是双方都可以访问的外设了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过"注册表"或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作"进程间通信&

Linux环境编程之IPC进程间通信(三):FIFO

管道是没有名字的,因此它只能在有亲缘关系的进程间使用,给管道加上名字,我们称之为有名管道FIFO,当然FIFO与管道之间不止有没有名字的区别,还有其他区别下面会提到.与管道类似的是,FIFO是一个单向(半双工)数据流.不同于管道的是,每个FIFO有一个路径名与之关联,从而允许无亲缘关系的进程之间访问同一个FIFO.FIFO是一种文件类型.stat结构成员st_mode的编码指明文件是否是FIFO类型,可以用S_ISFIFO宏对此进行测试. FIFO由mkfifo函数创建,它已经隐含指定了O_CR

Linux环境编程之IPC进程间通信(四):管道和FIFO比较

系统加于管道和FIFO的唯一限制是: 1.OPEN_MAX 一个进程在任意时刻打开的最大描述符数.可以通过调用sysconf函数查询. 2.PIPE_BUF 可原子地写往一个管道或FIFO的最大数据量.Posix任务它是一个路径名变量,它的值可以随指定的路径名而变化,因为不同的路径名可以落在不同文件系统上,而这些文件系统可能有不同的特征.所以PIPE_BUF可通过pathconf函数取得. pipeconf.c #include <stdio.h> #include <stdlib.h&

Linux环境编程之IPC进程间通信(二):管道

管道作为最古老的进程间通信方法,它有以下几个特点: 1.在所有的UNIX实现中都存在. 2.没有名字,因此只能由有亲缘关系的进程使用. 3.它由函数pipe创建,read和write函数访问,但只提供单路(单向)数据流. <span style="font-size:14px;">#include <unistd.h> int pipe(int fd[2]); 返回:若成功则为0,若出错则为-1</span> 经由参数fd返回两个文件描述符:fd[0

IPC进程间通信之管道

管道pipe是UNIX系统IPC进程间通信的最古老形式,并且所有UNIX系统都提供此种通信机制. 管道有下面两种局限性: 1.历史上,管道是半双工管道,数据只能在一个方向上流动,某些系统则提供了全双工管道. 2.管道只能在具有公共祖先的进程之间使用. 半双工管道虽然有自身的局限性,但仍是最常用的IPC形式.每当你在管道线中键入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然后将前一条命令进程的标准输出用管道与后一条命令的标准输入相连接. #include <unistd

Windows Server2016 安装及配置DFS实现数据复制

我们今天主要介绍的是Windows Server2016 安装及配置DFS实现数据复制,那什么是DFS呢?DFS就是Microsoft文件分布系统  是一个网络服务器组件,它能够使你更容易地在网络上查询和管理数据.分布式文件系统是将分布于不同电脑上的文件组合为单一的名称空间,并使得在网络上建立一个单一的.层次化多重文件服务器和服务器共享的工作更为方便的途径,使用户更加容易访问和管理物理上跨网络分布的文件.DFS为文件系统提供了单个访问点和一个逻辑树结构,通过DFS,用户在访问文件时不需要知道它们