`
arcticfox9902
  • 浏览: 108383 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
Windows进程间通信方式


1 文件映射

文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。

Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。

应用程序有三种方法来使多个进程共享一个文件映射对象。

(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。

(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。

(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。

文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。


2 共享内存

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


3 匿名管道

管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。

匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。

匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。


4 命名管道

命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。


5 邮件槽

邮件槽(Mailslots)提 供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。

通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。

邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。


6 剪贴板

剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。

剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。


7 动态数据交换

动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。

DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式:


(1) 冷链:数据交换是一次性数据传输,与剪贴板相同。

(2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。

(3) 热链:当数据交换时服务器自动给客户发送数据。

DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。


8 对象连接与嵌入

应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。

同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。


9 动态连接库

Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。

虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。


10 远程过程调用

Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。

由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。


11 NetBios函数

Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。


12 Sockets

Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。

现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。


13 WM_COPYDATA消息

WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。

WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

来自: http://hi.baidu.com/sinbh/blog/item/a3d386d145bec23f9b5027a9.html
分享到:
评论
2 楼 Mirclelisha 2011-12-11  
Mirclelisha 写道
恩 很好

1 楼 Mirclelisha 2011-12-11  
恩 很好

相关推荐

    Windows进程间通信

    在Windows操作系统中,进程间通信(IPC,Interprocess Communication)是一种技术,允许不同的进程之间共享数据、协调工作或交换信息。这种技术对于多线程和多进程应用的开发至关重要,尤其是在分布式系统和并发编程...

    Windows下进程间通信

    结合上述技术,一个典型的Windows进程间通信流程可能是这样的: 1. 启动进程A和进程B,它们都创建内存文件映射,共享同一块内存区域用于数据传输。 2. 进程A将数据写入内存映射区,同时增加一个信号量的计数值,...

    windows 与linux 进程间通信区别

    Windows和Linux作为当前主流的操作系统平台,它们在进程间通信方面有着各自的实现方式和特点。为了帮助开发者了解如何将Windows平台上开发的使用IPC的应用程序移植到Linux,本文将详细探讨Windows与Linux在进程间...

    windows内存共享进程间通信

    7. **其他进程间通信方式** 除了内存共享,Windows还提供其他IPC方式,如管道(Pipe)、套接字(Socket)、消息队列(Message Queue)等,每种方法都有其适用场景和优缺点,应根据实际需求选择。 8. **总结** ...

    window进程间通信(消息传递)

    下面将详细介绍几种常见的Windows进程间通信方式及其在MFC中的应用。 1. **WM_COPYDATA** 消息:这是最简单且常见的进程间通信方式之一。一个进程可以发送`WM_COPYDATA`消息到另一个进程,携带不超过64KB的数据。在...

    Windows 下的进程间通信

    本文将深入探讨Windows下的几种主要进程间通信方式。 一、管道(Pipes) 管道是早期的IPC机制,分为无名管道和命名管道。无名管道只能用于具有亲缘关系的进程间通信,通常在父子进程间使用;命名管道则可以在任意...

    Windows进程间通信开篇

    本篇文章将深入探讨Windows进程间通信的基本概念、常用技术以及"kaipian"源码可能涉及的具体实现。 首先,我们要理解什么是进程。在Windows系统中,进程是执行中的程序实例,拥有自己的内存空间,每个进程都有独立...

    windows API进程间的通信

    1. 进程间的通信方式:进程间的通信方式有很多种,如内存映射文件、命名消息、剪贴板甚至可以是磁盘文件。单个通信方式的实现较为简单。 2. 管道通信:管道是一种共享文件模式,它基于文件系统连接两个通信进程之间...

    C#与C++进程间通信

    在IT领域,进程间通信(IPC,Inter-Process Communication)是一项关键的技术,它允许不同的进程之间交换信息,协同工作。本示例以“C#与C++进程间通信”为主题,利用命名管道(Named Pipe)作为通信媒介,实现了...

    通过Windows窗口消息实现 QT进程间通信

    Windows窗口消息(Window Messages)是Windows API的一部分,它是进程间通信的一种简单但有效的方式。每个消息都由一个整数值标识(例如,WM_PAINT,WM_MOUSEMOVE等),并通过Windows消息队列进行传递。一个进程可以...

    跨平台进程间通信源码

    "跨平台进程间通信源码"可能就是一个这样的库,它可能封装了上述的多种通信方式,并提供了统一的API,使得开发者无需关心底层细节,只需关注业务逻辑。 具体到提供的压缩包文件`ipc_src`,里面可能包含了以下内容:...

    进程间通信例子

    在Windows环境中,实现进程间通信有多种方式,包括但不限于管道、消息队列、共享内存、套接字、命名管道、事件、信号量、邮件槽等。这个“进程间通信例子”可能是针对Windows Forms(WinForm)应用程序提供的一种...

    Windows进程间通信之共享内存

    共享内存方式实现进程间通信。详细看我的博客:http://blog.csdn.net/pengguokan/article/details/8921346

    windows下进程间通信总结

    ### Windows 下进程间通信总结 #### 一、进程与进程间通信的...总之,文件映射作为一种高效的进程间通信方式,在Windows环境下有着广泛的应用前景。掌握其原理及使用方法,对于开发高效稳定的应用程序具有重要意义。

    进程间通信的6种方式

    以下是对标题和描述中提及的六种进程间通信方式的详细解释: 1. **用户自定义消息**:在Windows操作系统中,进程可以通过发送自定义消息来实现通信。一个进程可以通过`PostMessage`或`SendMessage`函数向其他进程...

    进程间通信.pdf

    4. **基于Socket的IPC**:适用于网络环境,同时也可用于本地进程间通信,提供了高度灵活和可移植的通信方式。 5. **Linux IPC**:Linux系统在其基础上进行了优化和扩展,提供了丰富的IPC工具和API。 #### 主要IPC...

    进程间通信源码

    在实际开发中,选择合适的进程间通信方式需要考虑诸多因素,包括数据量、实时性需求、安全性、通信复杂度等。邮槽和匿名管道在简单场景下效果良好,但在更复杂的场景中,可能需要结合使用多种方法或选择更为强大的...

    进程间通信.rar

    在实际应用中,选择哪种进程间通信方式取决于具体需求。例如,如果需要高效且简单的通信,共享内存可能是最佳选择;如果需要简单的父子进程通信,无名管道就足够了;如果需要在不相关进程间通信,或者通信涉及网络,...

    delphi进程间通信

    每种进程间通信方式都有其适用场景,开发者应根据实际需求选择合适的方法。在使用过程中,还需要注意线程安全、数据同步以及错误处理等问题,确保通信的稳定性和可靠性。理解并掌握这些技术,对于提升Delphi应用程序...

Global site tag (gtag.js) - Google Analytics