Windows操作系统提供用于促进应用程序之间的通信和数据共享的机制。 总的来说,这些机制启用的活动称为
进程间通信
(IPC) 。 一些形式的 IPC 有助于在多个专业流程之间分工。 其他形式的 IPC 有助于在网络上的计算机之间分工。
通常,应用程序可以使用分类为客户端或服务器的 IPC。
客户端
是请求来自其他应用程序或进程的服务的应用程序或进程。
服务器
是响应客户端请求的应用程序或进程。 许多应用程序充当客户端和服务器,具体取决于情况。 例如,字处理应用程序可能充当客户端,从充当服务器的电子表格应用程序请求制造成本摘要表。 反过来,电子表格应用程序可能充当客户端,从自动化库存控制应用程序请求最新的库存级别。
确定应用程序将受益于 IPC 后,必须确定要使用的可用 IPC 方法。 应用程序可能会使用多个 IPC 机制。 这些问题的解答决定了应用程序是否可以使用一个或多个 IPC 机制受益。
应用程序是否能够与网络上其他计算机上运行的其他应用程序通信,或者应用程序是否足以与本地计算机上的应用程序通信?
应用程序是否能够与在其他可能在不同的操作系统上运行的应用程序通信 (,例如 16 位Windows或UNIX) 等不同操作系统上运行的应用程序?
应用程序的用户是否必须选择应用程序与之通信的其他应用程序,或者应用程序是否可以隐式查找其合作合作伙伴?
应用程序应以一般方式与许多不同的应用程序通信,例如允许与任何其他应用程序的剪切和粘贴操作,或者其通信要求应限制为与特定其他应用程序的一组受限交互?
性能是否是应用程序的关键方面? 所有 IPC 机制都包含一定数量的开销。
应用程序应是 GUI 应用程序还是控制台应用程序? 某些 IPC 机制需要 GUI 应用程序。
Windows支持以下 IPC 机制:
Mailslots
Windows 套接字
使用剪贴板进行 IPC
剪贴板充当应用程序之间数据共享的中心存储。 当用户在应用程序中执行剪切或复制操作时,应用程序会将所选数据放在剪贴板上,采用一个或多个标准格式或应用程序定义格式。 然后,任何其他应用程序都可以从剪贴板中检索数据,从它理解的可用格式中进行选择。 剪贴板是一种非常松散耦合的交换介质,应用程序只需就数据格式达成一致。 应用程序可以驻留在同一台计算机上,也可以驻留在网络上的不同计算机上。
关键点:
所有应用程序都应支持剪贴板,使其理解的数据格式。 例如,文本编辑器或字处理器至少应该能够生成和接受纯文本格式的剪贴板数据。 有关详细信息,请参阅
剪贴板
。
使用 OLE 管理
复合文档
的应用程序,即由来自不同应用程序的数据构成的文档。 OLE 提供服务,使应用程序能够轻松调用其他应用程序进行数据编辑。 例如,使用 OLE 的字处理器可以从电子表格嵌入图形。 用户可以通过选择嵌入的图表进行编辑,从字处理器内自动启动电子表格。 OLE 负责启动电子表格并显示用于编辑的图形。 当用户退出电子表格时,图形将在原始字处理器文档中更新。 电子表格似乎是字处理器的扩展。
OLE 的基础是组件对象模型 (COM) 。 使用 COM 的软件组件可以与其他各种组件通信,即使尚未编写这些组件。 组件作为对象和客户端进行交互。 分布式 COM 扩展 COM 编程模型,使其跨网络工作。
关键点:
OLE 支持复合文档,并使应用程序能够包含嵌入或链接的数据,在选择时,会自动启动另一个应用程序进行数据编辑。 这使应用程序可由使用 OLE 的任何其他应用程序扩展。 COM 对象通过一组或多组相关函数(称为
接口
)提供对对象数据的访问权限。 有关详细信息,请参阅 COM 和 ActiveX Object Services。
使用 IPC 的数据复制
数据复制使应用程序能够使用
WM_COPYDATA
消息将信息发送到另一个应用程序。 此方法需要在发送应用程序与接收应用程序之间进行合作。 接收应用程序必须知道信息的格式,并且能够识别发件人。 发送应用程序无法修改任何指针引用的内存。
关键点:
数据复制可用于使用Windows消息传送快速将信息发送到另一个应用程序。 有关详细信息,请参阅
数据复制
。
对 IPC 使用 DDE
DDE 是一种协议,允许应用程序以各种格式交换数据。 应用程序可以将 DDE 用于一次性数据交换,或持续交换,其中应用程序在新的数据可用时相互更新。
DDE 使用的数据格式与剪贴板使用的数据格式相同。 DDE 可以被视为剪贴板机制的扩展。 剪贴板几乎始终用于对用户命令的一次性响应,例如从菜单中选择“粘贴”命令。 DDE 通常也由用户命令启动,但它通常继续正常运行,而无需进一步的用户交互。 还可以为具有更紧密耦合通信要求的应用程序之间的特殊用途 IPC 定义自定义 DDE 数据格式。
DDE 交换可以在同一台计算机上运行的应用程序或网络上的不同计算机上发生。
关键点:
DDE 不如新技术那么高效。 但是,如果其他 IPC 机制不适合,或者必须与仅支持 DDE 的现有应用程序进行接口,仍可以使用 DDE。 有关详细信息,请参阅
动态数据Exchange
和
动态数据Exchange管理库
。
使用 IPC 的文件映射
文件映射
使进程能够将文件的内容视为进程地址空间中的内存块。 此过程可以使用简单的指针操作来检查和修改文件的内容。 当两个或多个进程访问同一文件映射时,每个进程都会收到指向其自己的地址空间中的内存的指针,该指针可用于读取或修改文件的内容。 进程必须使用同步对象(如信号灯)来防止多任务环境中的数据损坏。
可以使用文件映射的特殊情况在进程之间提供
命名的共享内存
。 如果在创建文件映射对象时指定系统交换文件,则文件映射对象被视为共享内存块。 其他进程可以通过打开同一文件映射对象来访问同一内存块。
文件映射非常高效,还提供操作系统支持的安全属性,可帮助防止未经授权的数据损坏。 文件映射只能在本地计算机上的进程之间使用;它不能通过网络使用。
关键点:
文件映射是同一台计算机上两个或多个进程共享数据的有效方法,但必须在进程之间提供同步。 有关详细信息,请参阅
文件映射
和
同步
。
使用 Mailslot for IPC
Mailslots 提供单向通信。 创建 mailslot 的任何进程都是
mailslot 服务器
。 其他进程(称为
mailslot 客户端
)通过将邮件写入其 mailslot 来将邮件发送到 mailslot 服务器。 传入邮件始终追加到 mailslot。 mailslot 保存邮件,直到 mailslot 服务器读取邮件。 进程可以是 mailslot 服务器和 mailslot 客户端,因此可以使用多个 mailslot 进行双向通信。
mailslot 客户端可以将邮件发送到本地计算机上的 mailslot、另一台计算机上的 mailslot 或指定网络域中所有计算机上具有相同名称的所有 mailslot。 广播到域上所有 mailslot 的邮件不能超过 400 字节,而发送到单个 mailslot 的邮件仅受邮件图服务器在创建 mailslot 时指定的最大邮件大小的限制。
要点:
Mailslots 为应用程序提供一种简单的方式来发送和接收短消息。 它们还提供在网络域中所有计算机上广播消息的功能。 有关详细信息,请参阅
Mailslots
。
使用管道进行 IPC
双向通信有两种类型的管道:匿名管道和命名管道。
匿名管道
使相关进程能够相互传输信息。 通常,匿名管道用于重定向子进程的标准输入或输出,以便它可以与其父进程交换数据。 若要 (双工操作) 双向交换数据,必须创建两个匿名管道。 父进程使用写入句柄将数据写入到一个管道,而子进程则使用该管道的读取句柄从该管道读取数据。 同样,子进程将数据写入其他管道,父进程从中读取数据。 匿名管道不能通过网络使用,也不能在不相关的进程之间使用。
命名管道
用于在不是相关进程的进程之间传输数据,以及不同计算机上的进程之间的数据。 通常,命名管道服务器进程会创建具有已知名称或要与其客户端通信的名称的命名管道。 知道管道名称的命名管道客户端进程可以打开其另一端,但受命名管道服务器进程指定的访问限制。 服务器和客户端都连接到管道后,可以通过对管道执行读取和写入操作来交换数据。
要点:
匿名管道提供了一种将标准输入或输出重定向到同一计算机上的子进程的高效方法。 命名管道提供一个简单的编程接口,用于在两个进程之间传输数据,无论是驻留在同一台计算机上还是通过网络传输数据。 有关详细信息,请参阅
管道
。
使用 RPC for IPC
RPC 使应用程序能够远程调用函数。 因此,RPC 使 IPC 与调用函数一样简单。 RPC 在单个计算机或网络上的不同计算机上运行进程。
Windows提供的 RPC 符合 Open Software Foundation (OSF) 分布式计算环境 (DCE) 。 这意味着使用 RPC 的应用程序能够与支持 DCE 的其他操作系统运行的应用程序通信。 RPC 自动支持数据转换,以考虑不同的硬件体系结构,以及不同环境之间的字节排序。
RPC 客户端和服务器紧密耦合,但仍保持高性能。 该系统广泛使用 RPC 来促进操作系统的不同部分之间的客户端/服务器关系。
要点:
RPC 是一个函数级接口,支持自动数据转换和其他操作系统的通信。 使用 RPC,可以创建高性能紧密耦合的分布式应用程序。 有关详细信息,请参阅
Microsoft RPC 组件
。
对 IPC 使用Windows套接字
Windows套接字是独立于协议的接口。 它利用基础协议的通信功能。 在Windows套接字 2 中,套接字句柄可以选择用作具有标准文件 I/O 函数的文件句柄。
Windows套接字基于BSD UNIX 操作系统 (BSD) 首先推广的套接字。 使用Windows套接字的应用程序可以在其他类型的系统上与其他套接字实现通信。 但是,并非所有传输服务提供商都支持所有可用的选项。
要点:
Windows套接字是一个独立于协议的接口,能够支持当前和新兴的网络功能。 有关详细信息,请参阅
Windows套接字 2
。