如何实现win9Xandroid进程间通讯数据通讯技术

Windows9X内核模式驱动程序的设计与策略 - 嵌入式处理器 - 电子工程世界网
Windows9X内核模式驱动程序的设计与策略
15:49:58来源: 电子技术应用 关键字:&&&&&&
&&&& & 摘 要: 在Windows&
98或Windows& 95下如何高效编写硬件设备驱劝程序是微机应用开发中迫切需要解决的问题。介绍了虚拟设备程序(VxD)在Windows&
9X下运行的机理和通信策略,以及如何设计驱动程序。
&&& 关键词: 保护模式 VMM& VxD& DPMI
&&& 1995年Microsoft公司推出了其新一代的桌面操作系统Windows&
95,从技术层面来看它是为发挥处理优越性能而设计的一个32位操作系统。而它出色的稳定性,强大的寻址能力,无不归功于对32位处理保护模式的充分应用。具体来讲,它利用了80386的保护机制,从操作系统到一般应用程序分别分到4个特权层上,操作系统享有最高的优先级,被安排在ring-0上运行,而优先级最低的普通应用程序被安排在ring-3上运行。这样做的好处是如果一般的应用程序在ring-3上崩溃将不会影响到ring-0的操作系统,另一方面也是对在ring-3上的应用程序所能访问到的资源做了一定的限制,从而大大降低了因应用程序直接操作而产生的意外错误。换句话说,在Windows&
98或Windows& 95下,应用程序不能像在实模式下可以随意操作硬件资源,而需要通过编写运行在内核模式(ring-0)的虚拟设备驱动程序(al&
device& driver)才能达到目的。因此,在Windows& 9X下如何高效编写硬件设备驱动程序是微机应用开发中迫切需要解决的问题。
&&& 1 Windows 9X系统结构
&&& 确切的说Windows 9X不是一个操作系统,而是一个操作系统的集合。当计算机运行在保护模式下时,有“两个”操作系统同时存在,即Windows
本身和一个更低的操作系统,我们把它称为VMM/DPMI(virtual machine
manager/Dos
mode interface)。VMM的主要目的是管理同时运行的32位保护模式Windows应用程序(Win32
applications?以及运行在虚拟86模式下的MS-DOS程序,前者称为“线程”(threads),后者称为VM(virtual
machine)。VMM使每一条线程拥有自己的独立地址空间,使每一个VM都“单独”占有CPU,并为它们提供各种服务。从图1中我们可以看出,threads和VMs所能访问到的资源已不是直接的物理资源,而是被VMM虚拟化virtualized?后的虚拟资源了。
&&& 另外,VMM是一个可扩充的“操作系统”,它的核心部件以及标准部件(比如,DMA控制器管理VDMAD,中断管理VPICD等)是由Microsoft提供的。但我们可以编写一些扩充模块,也就是用VxD来增强VMM对硬件的虚拟能力,使整个操作系统获得对新硬件的访问能力。不仅如此,这种扩充操作系统的办法,还能为Win32程序与MS-DOS程序之间的通讯提供一种新的途径以代替传统的MS-DOS设备驱动程序以及内存驻留程序TSRs。从某种意义上说,没有VxD不能完成的事情,而且由于VxD是运行的保护模式下,所以它并不占有宝贵的常规内存。此外,运行实模式MS-DOS驱动程序所导致的模式切换也不复存在。因此一般来讲,VxD的运行速度要高出MS-DOS驱动程序一倍以上。更重要的是VxD在Windows
9X下可以动态装入与卸载而不需要重新启动计算机,这就大大提高了系统的灵活性,同时也为即插即用(Plug
and Play)?提供了可能。与实模式的驱动程序相比,可动态装、卸载可谓是一场革命。
&&& 2 VxD的结构及通讯策略
&&& 普通的Win32应用程序都是PE格式(Portable Exectable
Format)?的,而VxD则不同,它没有一般程序的进出口而是输出一种称作设备描述块DDB(Device
Descriptor Block)的数据结构。它包括VxD设备ID、初始化顺序、Win32DeviceIOControl回调函数句柄、V86API句柄、PM
API句柄等VMM在调用VxD时所需要的重要信息。此外,同其他应用程序一样,VxD由五个段构成,它们分别是:
&&& (1)VxD_CODE段:保护模式代码段。该段包含VxD系统控制过程、回调过程、服务和API过程。
&&& (2)VxD_DATA段:保护模式数据段。该段包括设备描述表、服务表和部分VxD全局数据。
&&& (3)?VxD_ICODE段:保护模式初始化代码段(可选)。该段一般包括只在VxD初始化过程中使用的过程和服务,VMM在Init_Complete消息发生后丢弃此段。
& (4)VxD_IDATA段:保护模式初始化数据段(可选)。该段一般包括初始化过程和服务使用的数据,VMM在Init_Complete消息发生后丢弃此段。
& (5)VxD_REAL_INIT段:实模式初始化段(可选)。该段包含实模式初始化过程和数据,VMM在装载VxD其它部分之前调用此过程,过程返回后丢弃此段。
&&& 当VxD装入内存时,VxD通常要靠DDB中所添入的一个16位的VxD设备ID,以区别于其它VxD。为了防止与其他新VxD冲突,Microsoft通过请求和注册标识来保证自己的VxD设备ID没有被其它厂商使用,为此Microsoft保留0~01FFH之间的所有VxD设备ID供自己使用。
&&& 在编写VxD时首先要编写VMM的消息处理函数,以便作相应的处理。例如,在VxD装入内存时VMM对能动态装载的VxD发出SYS_DYNMAIC_DEVICE_INIT消息,在要求卸载VxD时VMM又向其发出SYS_DYNAMIC_DEVICE_EXIT消息。在VxD中只需编写相应的处理函数,便可达到设备初始化与卸载释放资源的目的。拿Win32程序来说,它使用CreateFile
API函数打开可动态装、卸载的VxD时VMM便会发出SYS_DYNAMIC_DEVICE_INIT消息。相应的,当它使用CloseHandle
API函数卸载VxD时VMM便会发生SYS_DYNAMIC_DEVICE_EXIT消息。
&&& 另外,在具体调用VxD中的函数时,也不像调用ring-3 DLL中的函数那样容易。我们以调用对象不同分以下几种情况讨论:
&&& (1)从其他VxD中调用(ring-0调用ring-0)
&&& 当生成VxD时,所有可以被其他VxD调用的函数都列在一个数组里,我们称这种函数为一个服务(Service)、这个数组为服务项目表(Service_Table?。在调用时,并不是用服务的名称而是直接使用该函数在数组中的索引号。例如对VMM中的1号服务Get_Cur_VM_Handle
&&& 可采用如下格式:
&&& int 20h
&&& 32位的DD由两部分组成,它的高字包含了VxD设备的ID,低字包含了服务号(这里VMM的设备ID为0001h。
&&& (2)从V86代码或Win16(保护模式)代码中调用?ring-3调用ring-0?
&&& 这里应用程序要申请被调用的VxD函数地址,这个地址可以通过int
2FH/AX=1648h调用获得。为了识别是调用哪一个VxD的函数,调用时可令BX=VxD设备ID。当int
2Fh指令返回时,寄存器ES:DI(对保护模式有ES:EDI)包含一个seg:(对保护模式有selector:offset?指针,调用该指针就可以把控制权交给运行在ring-0下的VxD
&&& (3)从Win32代码中调用(ring-3调用ring-0)
&&& Microsoft隐藏了Win32的VxD服务接口,作为替代提供了Windows
NT下的设备输入、输出控制(DeviceIOControl)Win32 API。Win32程序通过使用此函数向特定的VxD发送控制码与数据。与此相应在编写VxD时要提提供一个相应的回调函数以响应它所发出的W32_DeviceIOControl消息,并再去回调函数中响应相应的控制码,最后还要把该回调函数的句柄添加到DDB中。它的定义如下:
&&& BOOL DeviceloControl(
&&& HANDLE hDevice,//用CreateFile API函数打开VxD设备获得的句柄
&&& DWORD dwloControlCode,//ring3程序向VxD传递的命令码(可由编程写者自定)
&&&& LPVOID lpOutBuffer,//程序传给VxD的数据缓存的地址
&&& DWORD nlnBufferSize,//ring3程序传给VxD的数据缓存的字节数
&&& LPVOID lpOutBuffer,//VxD的返回数据所存放的缓存地址(该缓存由ring-3预留)
&&& DWORDnOutBufferSize,//VxD的返回数据所存放的缓存的字节数
&&& LPDWORD lpBytesReturned,//VxD实际返回数据的字节数
&&& LPOVERLAPPED lpOverlapped& //一个OVERLAPPED的结构地址,通常为NULL);
&&& 由此不难看出这种DeviceIOControl的结构也为VxD向ring-3回传数据提供了一种途径。这种通讯方式在NT的设备驱动程序中也得到了广泛应用,它是Microsoft大力提倡的Win32程序应采用的一种通讯方式。
&&& 3 VxD的实现
&&& 从编程工具方面来看,我们需要Windows 95 DDK和一个32bit的汇编编译器,如MASM6.11c,如果打算用C/C++开发驱动程序的话,还应选用一个32bit的c/c++4.0编译器,笔者推荐采用Micrfoft
Visual C++4.0以上的版本,因为它支持一种新的——declspec(naked)?
。采用该关键字的函数,编译器将不为其生成相应的函数进出口代码,这样对于采用特殊函数结构的VxD函数来说是非常方便的。除此之外,也有一些公司提供了一些VxD向导器以帮助用户生成C/C++的程序框架,使用它们可以大大提高开发效率,应予以考虑,其中最著名的有Vtoolsd95,VxD等。在编程中应注意,不要使用C/c++所提供的库函数,特别是Microsoft的MFC,因为它们都是运行在ring-3上的,如果非用不可的话,只有一些个别函数能通过使编译器生成嵌入式指令来达到目的,但这样做是要相当小心的。另外,调试运行在ring-0的驱动程序是相当困难的,VC++以及MASM中的调试均不能满足需要,而需采用内核级的调试工具比如Microsoft的WDEB386以及Numega的SoftIce等。
&&& 4 VxD的局限性
&&& VxD技术只适用于Windows 9X操作系统,Windows NT不支持此项技术,而是采用更为先进的面向对象的驱动程序模型,例如Windows
98和Windows 2000就采用了一种基于NT的驱动程序模型WDM。此外,由于VxD运行在ring-0上根本不受ring-3的制约,也给病毒的制造者即黑客以可乘之机,比如著名的CIH病毒是一个VxD。
关键字:&&&&&&
编辑: 引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。转&http://blog.csdn.net/microzone/article/details/7044266
1 Windows进程间通信的各种方法
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。
多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)
提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),
进程通信就是指不同进程间进行数据共享和数据交换。
  正因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题,
下面本文将对Win32中进程通信的几种方法加以分析和比较。
2 进程通信方法
2.1 文件映射
文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,
只需简单的指针操作就可读取和修改文件的内容。
Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,
实现了对文件中数据的共享。
应用程序有三种方法来使多个进程共享一个文件映射对象。
(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。
另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。
第二个进程复制该句柄就取得对该文件映射对象的访问权限。
文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中
,而开发者还必须控制进程间的同步。
2.2 共享内存
Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替 文件句柄(HANDLE),
就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用 文件映射实现的,
所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
a.设定一块共享内存区域
HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)// 产生一个file-mapping核心对象
LPVOID MapViewOfFile(
& & HANDLE hFileMappingObject,
& & DWORD dwDesiredAcess,
& & DWORD dwFileOffsetHigh,
& & DWORD dwFileOffsetLow,
& & DWORD dwNumberOfBytesToMap
);得到共享内存的指针
b.找出共享内存
& & 决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(),
然后调用GetLastError().如果传回的错误代码是 ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,
否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。
所有的进程都应该使用
HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);
再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
CloseHandle()
2.3 匿名管道
管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;
也可以是双向的一管道的两端点既可读也可写。
匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管 道,
然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。
这些子进程 可以使用管道直接通信,不需要通过父进程。
匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
2.4 命名管道
命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不 同计算机之间使用,
服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
2.5 邮件槽
邮件槽(Mailslots)提 供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给&
邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,
因此可建立多个 邮件槽实现进程间的双向通信。
通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。
广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,
而 命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,
所以邮件槽不失为应用程序发送 和接收消息的另一种选择。
2.6 剪贴板
   剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个 中介,
Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,
应 用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
剪贴板 是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;
对非 标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以&
转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
2.7 动态数据交换
动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,
通过发送更新值在应用程序间动态交换数据。
DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎&
总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三 种数据交换方式:
(1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
(2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
(3) 热链:当数据交换时服务器自动给客户发送数据。
DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。
大多数基于Windows的应用程序都支持DDE。
2.8 对象连接与嵌入
应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服 务。
例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,
该表格已在原 始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。
2.9 动态连接库
Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。
2.10 远程过程调用
Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。
RPC既可以在单机不同进程间使用也可以在网络中使用。
由于Win32 API提供的RPC服从OSF-DCE (Open Software Foundation Distributed Computing Environment)标准。
所以通过 Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程 序。
2.11 NetBios函数
Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,
其它应用程序最好不要使用NetBios函数来进行进程间通信。
2.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消息将更合适些。
2.13 WM_COPYDATA消息
WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,
参数是目 的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了 数据共享。
WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。
它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。
  Win32 API为应用程序实现进程间通信提供了如此多种选择方案,
那么开发者如何进行选择呢?通常在决定使用哪种IPC方法之前应考虑以下一些问题:
(1)应用程序是在网络环境下还是在单机环境下工作。
方法一:WM_COPYDATA&
HWND hReceiveDataWindow = FindWindow(NULL,....)
COPYDATASTRUCT
data.cbdata = strlen(pStr);
data.lpData = pS
SendMessage(hReceiveDataWindow ,WM_COPYDATA,(WPARAM)GetFocus(),(LPARAM)&data); &&
REF.最简单的方式
/TechLab/archive//2272.aspx
方法二:dll共享&
#pragma data_seg (&.ASHARE&)
int iWhatYouUseInTwo = 0;
#pragma data_seg()&
方法三:映象文件&
REF.最基础,效率最高的方法
最好的参考书《Windows核心编程》第17章 内存映射文件
/2005/10/interprocess_communications.html
方法四:匿名管道:CreatePipe&
方法五:命名管道:createnamedpipe
/bbshtml/bbs8/pediy8-724.htm
方法六:邮件通道&
方法七:网络接口,socket,但要求有网卡。可以实现不同主机间的IPC
另一篇总结的比较好的文章
/doc/Html/Visual%20C++/.html
进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:
& & & 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方
& & & 另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。
如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。
属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。
& 为了能在两个进程之间进行通讯,由以下几种方法可供参考:
0。剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持
1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口
2。使用共享内存方式(Shared Memory)
& a.设定一块共享内存区域 & & & &&
& & HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)
& & 产生一个file-mapping核心对象
& & LPVOID MapViewOfFile(
& & & & HANDLE hFileMappingObject,
& & & & DWORD dwDesiredAcess,
& & & & DWORD dwFileOffsetHigh,
& & & & DWORD dwFileOffsetLow,
& & & & DWORD dwNumberOfBytesToMap
& & 得到共享内存的指针
& b.找出共享内存
& & 决定这块内存要以点对点(peer to peer)的形式呈现
& & & & 每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
& & & & 都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
& & & & 错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 & & & &域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 & & & &一位,并接下来将共享内存初始化。
& & 还是要使用client/server架构中
& & & 只有server进程才应该产生并初始化共享内存。所有的进程都应该使用
HANDLE OpenFileMapping(DWORD dwDesiredAccess,
& & & & & & & & & & & & & & & & & BOOL bInheritHandle,
& & & & & & & & & & & & & & & & & LPCTSTR lpName);
& & & & 再调用MapViewOfFile(),取得共享内存的指针
& c.同步处理(Mutex)
& d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
& & & & & & & & & & & & CloseHandle()
3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
& 其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 & &指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 &
& 了,现在的内存只有一种就是虚存。&
4。消息管道(Message Pipe)
& 用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
& 访问一个平面文件一样读写数据。
& 匿名管道(Anonymous Pipes)
& & & 单向流动,并且只能够在同一电脑上的各个进程之间流动。
& 命名管道(Named Pipes)
& & & 双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 & & & &式,而使用ReadFile()只能读取该大小的倍数。
& & & 可以被使用于I/O Completion Ports
5 &邮件槽(Mailslots)
& & 广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 & & & &WIN9X下只支持邮件槽客户
6。Windows套接字(Windows Socket)
& 它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 & &用程序之间可以互相通信。
7。Internet通信 它让应用程序从Internet地址上载或下载文件
8。RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。
9。串行/并行通信(Serial/Parallel Communication)
& 它允许应用程序通过串行或并行端口与其他的应用程序通信
10。COM/DCOM
&通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 & &
函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
本文已收录于以下专栏:
相关文章推荐
开发项目时,自己写的服务SCP程序(带界面)需要跟windows服务进行通信,使用的是Event内核对象。
服务器端:CreateEvent(NULL, FALSE, TRUE, &MakeUI&)...
摘 要: 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microso...
http://blog.csdn.net/bjtbjt/article/details/7044266
1 Windows进程间通信的各种方法  
  
进程是装入内存并准备执行...
Win32 进程间通信的分析与比较 1 进程与进程通信    进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线 程...
    在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交...
之前碰到论坛里有几个好友,说程序不时的崩溃,什么xxoo不能read的! 
如果光要是这个内存地址,估计你会疯掉~~
所以分享一下基本的调试技巧,需要准备的工具有WinDbg + VC6.0,
  本篇文章的所有例子,基于RHEL6.5平台。本篇只介绍管道(匿名管道/普通管道),命名管道在后续文章中会介绍。
2.管道特性
管道是Linux支持的最初Unix IPC形式之一,具...
Windows进程间通信的各种方法
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的...
Windows进程间通信的各种方法
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系...
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 进程间通讯的方式 的文章

 

随机推荐