Windows下的进程通信

剪贴板
剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个 中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应 用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,
该值是Win32 API定义的常量;对非 标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。
利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。
但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
OpenClipboard() SetClipboardData() CloseClipboard()
OpenClipboard() GetClipboardData() CloseClipboard()

 

文件映射
打开文件-->计算文件大小-->创建内存映射对象Mapping-->mapofviewfile映射到自己的缓冲区中,
文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。
因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。
Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。
通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
  应用程序有三种方法来使多个进程共享一个文件映射对象。
  (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
  (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
  (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
  文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
CreateFile() CreateFileMapping() MapViewOfFile() UnmapViewOfFile()

 

命名管道:其中进程A创建了管道内核对象,以及用于读写管道的双线程。B进程通过对象名打开了A创建的内核对象,同时也创建了双线程进行命名管道的读与写。
#define WRITE_PIPE   L"\\\\.\\pipe\\ReadPipe"
#define READ_PIPE  L"\\\\.\\pipe\\WritePipe"
CreateNamedPipe() ReadFile() WriteFile()
CreateFile() ReadFile() WriteFile()
匿名管道:是不需要创建对象管道的名字。是通过内核对象的可继承性进行的,也就是说匿名管道只能作用于父子进程之间,
在父进程创建子进程的时候通过对CreateProcess函数中传参,即可让子进程获得父进程的内核对象句柄。
CreatePip() ReadFile() WriteFile()
//获取子进程的标准输入和标准输出句柄,即得到管道的读取和写入句柄
hRead=GetStdHandle(STD_INPUT_HANDLE);
hWrite=GetStdHandle(STD_OUTPUT_HANDLE);
ReadFile() WriteFile()

 

邮件槽:邮件槽的实现和命名管道大同小异,都是A创建对象-->A写入数据-->B打开A创建的对象-->B读入数据
邮槽是基于广播通信体系设计出来的,采用无连接的不可靠的数据传输。
邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。
为保证邮槽能在各种win平台下正常工作,传输信息时,应将消息长度限制在424字节以下。
#define  MAIL_SLOT_NAME  L"\\\\.\\mailslot\\Name" 
CreateMailslot() GetMailslotInfo() ReadFile()
CreateFile() WriteFile()

 

共享内存
Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替 文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用 文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
CreateFileMapping() MapViewOfFile() UnmapViewOfFile()
OpenFileMapping() MapViewOfFile() UnmapViewOfFile()

 

消息:这种方式是由操作系统负责给目标窗口传递,所以目标进程必须需要窗口,不然A得不到窗口句柄就无法传递。
通过Windows消息队列传递,看起来与之前的内核对象传递消息有悖,那是因为操作系统把相关细节都屏蔽掉了,如果深究起来还是通过Ring0的操作系统空间内核对象进行传递
WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了 数据共享。
WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。
COPYDATASTRUCT  Temp; ::FindWindow() ::SendMessage()
进程B需要添加WM_COPYDATA消息:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值