另一个应用程序以共享方式打开这个文件并读取其中的内容,  窗子提供的永远只是局部的风景

  为什麽需要 IPC,  为什麽需要 Inter-process Communication,应用程式是电脑软体的主要分类之一,是指为针对使用者的某种应用目的所撰写的软体,DDE还有网络功能,另一个应用程序以共享方式打开这个文件并读取其中的内容,一个应用程序往该文件里写数据(可以不关闭文件,另一个应用程序以共享方式打开这个文件并读取其中的内容,一个应用程序往该文件里写数据(可以不关闭文件,另一个应用程序以共享方式打开这个文件并读取其中的内容

Win32 行程通讯的观念与技术 
  窗子提供的永远只是局部的风景。身为窗子的制造者以及使用者的我们不可能不明白这个道理;对於窗子的使用者日益挑剔的品味,窗子的制造者所能提供的不仅止於窗子的大小,往往是窗子的数量。的确,探出窗去看得将更多一些,外头天空地宽朗朗白日,别的窗子也许正有我们想要的风景。

ylbtech-Miscellaneos:应用程式

应用程序之间互相通讯的几种方法,应用程序几种方法

转自:

 

应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。  

1、共享 

在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。  

2、DDE 

每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。  

DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。  

3、WM_COPYDATA  

Windows消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我们为什么不把数据放在消息中一起发送出去呢?这样,我们只要调用SendMessage(),以对方窗体的句柄作为第一个参数,以含有指向实际数据的指针结构的地址作为第二个参数,就可以把整个数据块当作消息发向另一个应用程序。也许有的程序员会说,一个自定义的消息同样可以完成这样的工作。他只说对了一半。自定义消息的确可以发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程中才是合法的,若在其它模块中存取该内存区就会导致“Access Violation”。而使用WM_COPYDATA 则不存在这个问题,因为Windows 本身会替你处理这一切。深入钻研下去,你会发现它其实是先创建了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,然后再在接收方对这个映射文件打开一个“视图”。WM_COPYDATA 的不足之处在于:必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源)。  

4、NetBIOS 

从80年代开始,NetBIOS就是开发Client/Server类程序的标准接口。而当时其它的解决方案几乎都是从UNIX系统上发展而来的。当然,对于今天的用户而言,NetBIOS已不是唯一的选择,他们可以从各种方案中择优选取。在Windows 95和NT平台上,可以通过API函数Netbios()来调用NetBIOS功能。  

NetBIOS兼容以下几种低层协议:NetBEUI协议(NBF)、NWLink NetBIOS(NWNBlink)、NetBIOS over TCP/IP(NetBT)。NetBIOS的优点是速度较快,缺点是可靠性较差。  

5、标准的Sockets和WinSock  

Sockets是15年前在UNIX系统上提出来的,一开始主要是用于本地通讯,但很快就应用在Client/Server体系上了。它的内核很简单:你可以将一个Socket看作是一个双向的节点,一个应用程序可以通过它先与另一个程序建立连接(建立在一个双方都认可的端上,以便于区分同时运行的几个通讯线程),然后就可以彼此交换数据了。  

微软公司在其基础上创建了WinSock,专门用于Windows接口,与Socket完全兼容。近年来基于TCP/IP协议的网络大行其道,Socket也随之获得了更加广泛的应用。  

如今,Sockets已在Internet上获得了最广泛的应用,主要是因为它的可移植性好:  

Socket应用程序无论在任何平台间都能互相进行通讯(不管是PC机还是Macintosh,也不管是Windows平台还是UNIX平台)。而最新推出的WinSock 2.0,已不仅仅只基于TCP/IP协议,还可基于其它几种传输协议(如IPX)。  

Socket的缺陷是它工作在通讯的低层,所以实现起来较为复杂(如果是Win 95或NT平台,则不存在这个问题,微软公司提供了相应的控件)。但是,如果要在多个平台间互相通讯,则Socket是不二之选。  

6、Mailslot和Pipe 

Mailslot和Pipe有很多相同点,即都是高层的、基于内存的通讯系统。Mailslot由Server端创建,代码如下:
 

myMailslot = CreateMailslot(pSlotName, 0, MAILSLOT_WAIT_FOREVER, NULL);  

然后,Client端就可以像打开文件一样打开这个Mailslot,再通过API函数WriteFile()来将数据写入到消息队列中。  

与此相类似,Pipe也是由Server端创建的,代码如下:  

pipe = CreateNamedPipe(pPipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE |PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, BUFSIZE,BUFSIZE, 20000, NULL);   

接着,Client端就可以通过一般的文件API读写数据,代码如

<br>pipe = CreateFile(pPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,0,NULL); <br>success = WriteFile(pipe, pMessage, strlen(pMessage) + 1, &bytesWritten, NULL);  

Pipe分两种,即命名Pipe和匿名Pipe。匿名Pipe是以句柄而不是以名字来进行标识的,因而也就限制了它只能在同一台机器上通讯,而不能应用于网络。命名Pipe则提供了以名字来进行标识,所以能在网络上的其它任何地方打开它。需要注意的是:命名Pipe只能在 Win NT而不是Win 95上创建(即Server

端),Client端则可以是任意平台。  <br><br>Pipe既可以单向通讯也可以双向通讯,Mailslot则只能单向通讯。Client端可以发送消息给mailslot,但不能接收消息;如果你想要接收消息,则只能创建一个新的mailslot。但mailslot有一个很大的优点:它支持数据广播。也就是说,若Client端发送一条消息,

则整个网络中的同名对象都能收到。这是因为mailslot的名字的作用域只是在本台机器上,所以可在不同机器上创建同名的mailslot,当Client端发来消息时则每一台机上的mailslot都得到了该消息的一份拷贝,并在本机上作出相应的反应。Mailslot的最大缺陷是不可靠,因为它的数据是以数据报格式来传送

的,网络错误或负荷过重都会导致数据丢失。  

转自:
应用程序之间的数据交换(互相通…

转自:http://blog.csdn.net/jxufewbt/article/details/1769312

转自:http://blog.csdn.net/jxufewbt/article/details/1769312

  这篇文章谈的是 Interprocess Communication
(IPC),我将与你分享跨行程通讯的各项技术与资料交换的方法。

 

 

 

  为什麽需要 IPC?
  为什麽需要 Inter-process Communication?

A,返回顶部

应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。  

应用程序之间的数据交换(互相通讯)一直是困扰广大程序员的难题,尽管已经出现了各式各样的解决方案,但迄今为止没有哪一种方案是完美无缺的。因此,只有学习并了解了它们的优缺点后,才能在特定的情况下选择最佳方案,以满足最终的要求。  

  显而易见的,没有一个视窗应用程式可以包办全部的工作。为了避免资料重覆输入的时间浪费与人为错误,各应用程式间的资料会有互相交换的需求。首先的压力将来自於使用者,甚至於很可能是你自己。先不说别的,在写这篇文章时,我就曾剪贴原来以
Delphi
撰写的程式到文书编辑软体,同时,也利用抓图软体帮我拍下执行画面,最後,这些文章与范例程式得用压缩程式压起来,然後E-mail寄给杂志编辑。

1,

1、共享 

1、共享 

  使用 IPC
在某些情况下是不得不然的决定,有时候程式必须跨过机器边界让另一部机器内的程式明白该怎麽合作来共同完成工作,这同时也暗示我们可能面临不同的作业系统的问题。

应用程式是电脑软体的主要分类之一,是指为针对使用者的某种应用目的所撰写的软体。

在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。  

在硬盘上建立一个文件,一个应用程序往该文件里写数据(可以不关闭文件,但必须刷新缓冲区),另一个应用程序以共享方式打开这个文件并读取其中的内容,这便是最简单的一种数据交换方式。对于网络用户而言,只要两台终端上安装的都是Win311 For Workgroup或Windows 95(或NT),则只要设置一下目录共享,映射成网络驱动器,同样可以简单地实现数据交换。但它的缺点也是显而易见的:只能采取轮询的方式获得最新数据(效率低下),网络映射的驱动器绝对不能变动或取消(可靠性差),所以这是一种“低级”的通讯方式。  

  此外,IPC有助於系统的安全与稳定。由於Win32各个行程彼此独立的特性,一个行程死掉了,其他的行程还可以继续跑下去,对於某些稳定性要求很高的系统而言,
值得以额外的负担(Overhead)交换系统的强固性(robustness)。嗯!
我的意思是说,因为系统对稳定性的需求要求较高,值得拆开来做甚至额外的备援系统,既然工作拆成两个以上,此时必然需要IPC。

应用程式通常又被分为两部分:图形使用者介面(GUI)和引擎(Engien)

2、DDE 

2、DDE 

  关於IPC,一般人可能会对其有「执行效率缓慢」的印象,这当然不能说是错误的,但绝不是公平的评语。这麽说吧:一个主管亲自去做一件事,往往会比先说明再授权下属去做来得快,这是单一工作时的情况;然而如果管理者同时有好几件事在手上,托付别人去做才能使得整个公司的效能提高。换句话说,如果能善用
IPC,整体的系统效能不仅不会下降,反而可能因为充分利用整个运算群的能力而有提升。

它与应用软体的概念不同。应用软体指使用的目的分类,可以是单一程式或其他从属元件的集合,例如Microsoft
Office、OpenOffice。应用程式指单一可执行档或单一程式,例如Word、Photoshop。日常中可不将两者仔细区分。一般视程式为软体的一个组成部分。

每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。  

每个Windows程序员都不会对DDE(动态数据交换)感到陌生,它是最早的基于Windows的数据交换方法,有三种方式可供选择:冷连接、温连接和热连接。一般都是由客户端向服务器端发出连接申请,并且必须指明服务器端的名字和标题。在连接建立后,数据可以双向流动。典型的例子如抓图软件SnagIt,它提供了DDE接口,能够让其它应用程序来控制它。DDE是完全向后兼容的,从16位平台转到32位,源代码几乎不用修改。  

  我们的第一个 IPC 例子
  每个图形介面的视窗应用程式都接受并处理讯息(Message),因此,使用讯息伫列通知其他的行程是脑中很自然会浮现的第一个想法;换句话说,两行程间彼此互相以
SendMessage() 或 PostMessage() 传送讯息通知对方。

2,

DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。  

DDE还有网络功能。使用过Win311 For Workgroup的人大概都还记得,它自带一个非常吸引人的小程序“Chat”,能使两台计算机通过网络实时交谈,这在当时几乎是一项创举。可是很少有人知道“Chat”使用的是一种特殊的DDE,即NetDDE。它的基本工作原理仍然是DDE,但它能使一台计算机向在同一个网络中的另一台终端发消息,而不像普通DDE 只能局限在同一台机器上。与其它的数据交换方式相比,DDE已不够先进,而且Microsoft也不再积极支持DDE,所以它的前景不被看好。  

  即然要互送讯息,就需要一个彼此都认得的讯息编号。於是,除了 Windows
标准的讯息编号之外,我们还需要额外定义一个(一些)讯息。

http://baike.baidu.com/item/应用程式/18758462?fromtitle=应用程序&fromid=5985445&type=syn

3、WM_COPYDATA  

3、WM_COPYDATA  

  行程通讯间用来约定讯息编号常用的方法是呼叫RegisterWindowMessage()
API函数。这个函数只有一个字串型别的引数,Windows系统会检查我们传入的讯息名称并传回一个安全不重覆的讯息编号,假如传入的讯息名称早已经登记有案,则系统传回的是稍早传给那个行程的相同编号。

3,

Windows消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我们为什么不把数据放在消息中一起发送出去呢?这样,我们只要调用SendMessage(),以对方窗体的句柄作为第一个参数,以含有指向实际数据的指针结构的地址作为第二个参数,就可以把整个数据块当作消息发向另一个应用程序。也许有的程序员会说,一个自定义的消息同样可以完成这样的工作。他只说对了一半。自定义消息的确可以发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程中才是合法的,若在其它模块中存取该内存区就会导致“Access Violation”。而使用WM_COPYDATA 则不存在这个问题,因为Windows 本身会替你处理这一切。深入钻研下去,你会发现它其实是先创建了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,然后再在接收方对这个映射文件打开一个“视图”。WM_COPYDATA 的不足之处在于:必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源)。  

Windows消息WM_COPYDATA功能强大,知之者却甚少。它的确切定义是:一个应用程序向另一个应用程序传递数据时所发出的消息。众所周知,Windows 在很大程度上依赖于消息机制,那么我们为什么不把数据放在消息中一起发送出去呢?这样,我们只要调用SendMessage(),以对方窗体的句柄作为第一个参数,以含有指向实际数据的指针结构的地址作为第二个参数,就可以把整个数据块当作消息发向另一个应用程序。也许有的程序员会说,一个自定义的消息同样可以完成这样的工作。他只说对了一半。自定义消息的确可以发送到其它的应用程序上去,但其原始数据所在的内存区只有在发送过程中才是合法的,若在其它模块中存取该内存区就会导致“Access Violation”。而使用WM_COPYDATA 则不存在这个问题,因为Windows 本身会替你处理这一切。深入钻研下去,你会发现它其实是先创建了一个文件映射的对象,将发送方的原始数据先拷贝至映射文件,然后再在接收方对这个映射文件打开一个“视图”。WM_COPYDATA 的不足之处在于:必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源)。  

  换句话说,两支程式只要彼此都用相同的讯息名称呼叫RegisterWindowMessage()
注册讯息,系统便会都给两者一个相同的自订讯息编号。

B,应用程式类别返回顶部

4、NetBIOS 

4、NetBIOS