【转】VC管道

windows VC:

1.剪切板 --系统维护的一块内存区域  放入取出

bool openClipBorad(...)

HANDLE SetClipboardData(...)  有直接提交 和延迟提交

GlobalAlloc  GlobalLock GlobalUnlock 

EmptyClipboard(...)

GetClipBoard(...)

 

2.匿名管道: 父子进城之间传输

 

 

BOOL WINAPI CreatePipe( __out     PHANDLE hReadPipe, __out     PHANDLE hWritePipe, __in_opt  LPSECURITY_ATTRIBUTES lpPipeAttributes, __in      DWORD nSize );

http://msdn.microsoft.com/en-us/library/aa365152(VS.85).aspx

 

BOOL WINAPI CreateProcess( __in_opt     LPCTSTR lpApplicationName, __inout_opt  LPTSTR lpCommandLine, __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes, __in         BOOL bInheritHandles, __in         DWORD dwCreationFlags, __in_opt     LPVOID lpEnvironment, __in_opt     LPCTSTR lpCurrentDirectory, __in         LPSTARTUPINFO lpStartupInfo, __out        LPPROCESS_INFORMATION lpProcessInformation );

http://msdn.microsoft.com/en-us/library/ms682425%28v=VS.85%29.aspx

 

( 1) 匿名管道只能用于相关进程( 如父子进程、兄弟进程) 之间的通信, 并且它建立在内存区域。进程终止后, 匿名管道也就消失了。匿名管道使得关联的进程可以互相传送信息, 通常匿名管道用于重定向子进程的标准输入输出, 以便于和父进程交换数据。要双向交换数据必须创建两个匿名管道。父进程使用写句柄写数据到一个管道, 子进程使用读句柄从管道中读取数据, 相应的子进程使用写句柄写数据到另一个管道,父进程使用读句柄从管道中读取数据。匿名管道是同一台计算机的关联进程的子进程重定向标准输入输出
的一种有效方法, 但不能用于网络环境, 也不能用于非关联的进程间。

( 2) 命名管道是在管道服务器和一台或多台管道客户机之间进行单向或双向通信的一种命名的管道。一个命名管道的所有实例共享同一个管道名, 但是每一个实例均拥有独立的缓存与句柄, 并且为客户—服务通信提供一个分离的管道。实例的使用保证了多个管道客户能够在同一时间使用同一个命名管道。命名管道用于在非关联进程和不同计算机上的进程间传送数据。通常命名管道服务器进程创建使用一个众所周知的名字或客户机知道名字的命名管道, 知道管道名字的命名管道客户机进程在管道另一端打开管道,并服从服务器进程指定的访问限制。在服务器和客户机都连接到管道后, 就可以在管道上使用读写操作来交换数据。命名管道在进程间提供一个传送数据的简单的编程接口, 不管进程是否在同一台计算机上。命名管道是围绕Windows 文件系统而设计的一种机制, 采用的是命名管道文件系统(Named Pipe FileSystem, NPFS) 接口, 对数据的收发也采用文件读写函

数ReadFile( ) 和WriteFile( ) 来完成。在设计上, 由于命名管道也利用了微软网络提供者(MSNP) 重定向器, 因此无需涉及底层的通信协议细节。命名管道还充分利
用了Windows NT 及Windows 2000 内建的安全特性,通信的安全性相对较好。Microsoft Windows NT、Windows 2000、Windows 95以及Windows 98 均提供对命名管道的支持( 不包括Windows CE) , 但只有Windows NT 和Windows 2000才支持服务器端的命名管道技术。在Windows 2000 下命名管道与I /0 子系统紧密联系在一起, 实际上它实
现的是一个文件系统驱动程序, 用户所看到的管道只不过是另一个文件系统。命名管道相对比较复杂, 服务端以管道名为参数调用CreateNamedPipe( ) 建立命名管道。当服务端第一次调用CreateNamedPipe( ) 时, 还需指定可同时存在的管道实例数。客户端调用CreateFile() 连接管道, 如果管道可用, 则返回管道实例;如果没有管道实例可用, 客户端调用WaitNamedPipe( ) 等待服务端建立管道实例。
2.1 命名规范
每一个命名管道都有一个唯一的名字, 以区分存在于系统的命名对象列表中的其他命名管道。管道服务器在调用CreateNamedPipe( ) 函数创建命名管道的一个或多个实例时为其指定了名称。对于管道客户机,则是在调用CreateFile( ) 或CallNamedPipe( ) 函数以连接一个命名管道实例时对管道名进行指定。命名管道的命名规范与邮槽有些类似, 对其标识也是采用的

UNC 格式: \\Server\Pipe\ [ Path]Name, 其中, 第一部分\\Server 指定了服务器的名字, 命名管道服务即在此服务器创建, 其字串部分可表示为一个小数点( 表示本机) 、星号( 当前网络字段) 、域名或是一个真正的服务; 第二部分\Pipe 与邮槽的\Mailslot 一样是一个不可变化的硬编码字串, 以指出该文件是从属于NPFS; 第三部分\[ Path]Name 则使应用程序可以唯一定义及标识一个命名管道的名字, 而且可以设置多级目录。

2.2 通信模式
命名管道提供了两种基本的通信模式: 字节模式和消息模式, 可在CreateNamePipe( ) 创建命名管道时分别用PIPE_TYPE_BYTE 和PIPE_TYPE_MESSAGE标志进行设定。在字节模式中, 信息以连续字节流的形式在客户与服务器之间流动。这也就意味着对于客户机应用和服务器应用在任何一个特定的时间段内都无法准确知道有多少字节从管道中读出或写入。在这种通信模式中, 一方在向管道写入某个数量的字节后并不能保证管道的另一方能读出等量的字节。对于消息模式, 客户机和服务器则是通过一系列不连续的数据
包进行数据的收发。从管道发出的每一条消息都必须作为一条完整的消息读入。
2.3 实现方法
要想实现一个命名管道服务器必须开发一个应用程序, 通过它创建命名管道的一个或多个“实例”, 再由客户机进行访问。对服务器来说, 管道实例实际就是一个句柄, 用于从本地或远程客户机的应用程序接受一个连接请求。按照下面的步骤, 可以写出一个基本的服务器应用程序。
( 1) 使用API 函数CreateNamedPipe 创建一个命
名管道实例句柄。
( 2) 使用API 函数ConnectNamedPipe 在命名管道
实例上监听客户机的连接请求。
( 3) 分别使用API 函数ReadFile 和WriteFile 从客
户机接收数据或将数据发送给客户机。
( 4) 使用API 函数DisconnectNamedPipe 关闭命名
管道的连接。
( 5) 使用API 函数CloseHandle 关闭命名管道实例
句柄
实现一个命名管道客户机时要开发一个应用程序, 令其建立与某个命名管道服务器的连接。注意客户机不可创建命名管道实例, 它可打开来自服务器的现成的实例。按照下面步骤, 可以编写一个最基本的客户机应用程序。

a、使用API 函数WaitNamePipe 等待一个命名管
道实例供自已使用。
b、使用API 函数CreateFile 建立与命名管道的连
接。
c、使用API 函数WriteFile 和ReadFile 分别向服
务器发送数据或从中接收数据。
d、使用API 函数CloseHandle 关闭打开的命名管
道会话。

posted on 2011-12-30 15:09  MIRC_C  阅读(542)  评论(0)    收藏  举报

导航