1、动态数据交换(DDE)和网络动态数据交换(NDDE)[1,2]
DDE可能是最为强大的进程间通信方式,实现也非常复杂。通信的两端分为服务端与客户端,两端都需要具有窗口。
一个DDE的通信过程大致如下:
DDE会话由客户端发起,先初始化一个会话。DDE客户端会向服务端发送一个WM_DDE_INITIATE窗口消息。服务窗口收到此消息后,根据条件判断是否需要响应此消息,如果服务端确定可以与客户端建立会话,那么会返回WM_DDE_ACK消息。如果客户端成功收到了服务端发送的WM_DDE_ACK窗口消息,那么会话就已经建立,之后就进行数据的传输。
数据传输分为很多种方式,可以只传输一个单独的数据项,也可以再建立一个永久数据连接( Permanent Data Link)。
如果进行独立数据项传输,数据传输的单位是数据项。客户端使用WM_DDE_REQUEST和WM_DDE_POKE消息向服务端接收和发送数据项。数据的传输使用WM_DDE_DATA消息。
而永久数据连接的建立也是通过客户端发起,客户端向服务端发送WM_DDE_ADVISE消息,服务端根据情况做出回应,根据是否能够建立连接而返回不同的WM_DDE_ACK消息。终止数据连接使用消息WM_DDE_UNADVISE。
客户端还可以使用WM_DDE_EXECUTE请服务端发送命令。
终止一个DDE会话使用WM_DDE_TERMINATE消息。
几乎所有的过程都是由客户端发起请求,而服务端响应,服务端响应的方向大多是发送一个WM_DDE_ACK消息。
DDE的通信需要操作系统ATOM表的帮助,用于索引数据。操作ATOM表有专门的API。
2、通过File Mapping在进程间共享数据[3]
共享文件是一种高效的进程间通信方式,因为直接共享内存,所以访问速度非常快。而且允许大量数据传输。
共享内存的进程间通信与其他进程间通信方式相比,限制条件要少。比如邮槽对数据大小和数据流向有限制,管道只能采用半双工通信形式等,剪贴板容易受其他进程影响等。
使用File Mapping共享数据也有缺点。最大的缺点是无法实现实时性,一个进程无论是写入还是读出数据后,另一个进程都不知道对方的操作是否已经完成。因此在要求实时数据传输时,File Mapping通常与其他进程通信方式配合使用,用于传输大量的数据。
3、Windows Socket
利用Windows Socket实现的进程间通信借用了Socket通信的原理。其实任何可以在两台主机间进行网络数据通信的机制都可以用于进程间通信。
如果在一台主机上既使用Socket服务端又实现Socket客户端,那么客户端在连接服务端时将IP指定为本机,就可以实现同一主机上的Socket服务端进程和Socket客户端进程间的通信。
使用Socket进行进程间通信既可以实现实时性,又可以传输大数据量信息,且数据传输的速度也很快,因此应用范围很广泛。
在进程间实现Socket通信的原理和程序实现方法与实现不同主机间的Socket通信没有区别。
参考
[1] 精通Windows API 函数、接口、编程实例
[2] http://msdn.microsoft.com/en-us/library/ms648711%28VS.85%29.aspx
[3] http://www.cnblogs.com/mydomain/archive/2011/01/07/1929874.html