选择特殊符号

选择搜索类型

热门搜索

首页 > 百科 > 建设工程百科

CreateNamedPipe

CreateNamedPipe创建一个命名管道。返回的句柄由管道的服务器端使用。

CreateNamedPipe基本信息

CreateNamedPipe适用平台

Windows NT

查看详情

CreateNamedPipe造价信息

  • 市场价
  • 信息价
  • 询价

CreateNamedPipe简介

CreateNamedPipe

VB声明

Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" (ByVal lpName As String, ByVal dwOpenMode As Long, ByVal dwPipeMode As Long, ByVal nMaxInstances As Long, ByVal nOutBufferSize As Long, ByVal nInBufferSize As Long, ByVal nDefaultTimeOut As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

说明

创建一个命名管道。返回的句柄由管道的服务器端使用

返回值

Long,如执行成功,返回管道的句柄。INVALID_HANDLE_VALUE表示失败。会设置GetLastError

参数表

参数 类型及说明

lpName String,指定管道名,采用的形式是:\\.\管道\管道名。最多可达256个字符的长度,而且不用区分大小写。如果存在指定名字的一个管道,则创建那个管道的一个新实例

dwOpenMode Long,下述常数组的一个组合

下述常数之一(对于管道的所有实例都要一样):

PIPE_ACCESS_DUPLEX 管道是双向的

PIPE_ACCESS_INBOUND 数据从客户端流到服务器端

PIPE_ACCESS_OUTBOUND 数据从服务器端流到客户端

下述常数的任意组合

FILE_FLAG_WRITE_THROUGH 在网络中建立的字节型管道内,强迫数据在每次读写操作的时候通过网络传输。否则传输就可能延迟

FILE_FLAG_OVERLAPPED 允许(但不要求)用这个管道进行异步(重叠式)操作

常数WRITE_DAC, WRITE_OWNER 和 ACCESS_ SYSTEM_SECURITY提供了附加的安全选项

dwPipeMode Long,下述常数组的一个组合:

下述常数之一(管道的所有实例都必须指定相同的常数)

PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道

PIPE_TYPE_MESSAGE 数据用数据块(名为"消息"或"报文")的形式写入管道

下述常数之一:

PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出

PIPE_READMODE_MESSAGE 数据以名为"消息"的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)

下述常数之一:

PIPE_WAIT 同步操作在等待的时候挂起线程

PIPE_NOWAIT(不推荐!) 同步操作立即返回。这样可为异步传输提供一种落后的实现方法,已由Win32的重叠式传输机制取代了

nMaxInstances Long,这个管道能够创建的最大实例数量。必须是1到常数PIPE_UNLIMITED_INSTANCES间的一个值。它对于管道的所有实例来说都应是相同的

nOutBufferSize Long,建议的输出缓冲区长度;零表示用默认设置

nInBufferSize Long,建议的输入缓冲区长度;零表示用默认设置

nDefaultTimeOut Long,管道的默认等待超时。对一个管道的所有实例来说都应相同

lpSecurityAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或者传递零值(将参数声明为ByVal As Long,并传递零值),以便使用不允许继承的一个默认描述符

查看详情

CreateNamedPipe常见问题

查看详情

CreateNamedPipe文献

PIPENET长距离供水停泵水锤设置原则 PIPENET长距离供水停泵水锤设置原则

PIPENET长距离供水停泵水锤设置原则

格式:pdf

大小:464KB

页数: 7页

PIPENET软件用于长距离输水工程停泵水锤计算说明 1、水泵设置说明 1.1 泵 类 型 说 明 : 停 泵 水 锤 计 算 需 要 应 用 TURBO PUMP , 如 图 所 示 : 。 1.2 定义 TURBOPUMP需要参数如下: WH( x)、WB(x)即为泵的全特性曲线,即 Suter Curve曲线。 该曲线一般厂家提供不了, 只能由已有的全特性曲线通过数值拟合的方法得到。 PIPENET 软件提供了 EXCEL表格来拟合该曲线。 PIPENET软件提供了国际上通用的三种比转速 25、147、 261的泵全特性曲线。 应用 PIPENET提供的 EXCEL表格拟合泵全特性曲线: 第一步:计算泵的比转速 如果泵的比转速接近 25 或在 25 一下,则直接选取比转速为 25的全特性曲线即可; 在 147 周围直接选取 147 的曲线即可; 在 261 周围或大于 261 直接选

ATEN宏正推出支持4KUHD的DisplayPortKVM切换器 ATEN宏正推出支持4KUHD的DisplayPortKVM切换器

ATEN宏正推出支持4KUHD的DisplayPortKVM切换器

格式:pdf

大小:464KB

页数: 1页

宏正自动科技近日推出2端口USBDisplayPortKVM多电脑切换器CS782DP。CS782DP支持高画质分辨率达3840×2160@60Hz,是FullHD1080p的4倍。该设备可让用户通过单一组USB键盘、USB鼠标及DisplayPort屏幕控制操作两台4KUHD电脑。

管道通信技术要求

命名管道程序设计的实现

1.命名管道Server和Client间通信的实现流程

(1)建立连接:服务端通过函数CreateNamedPipe创建一个命名管道的实例并返回用于今后操作的句柄,或为已存在的管道创建新的实例。如果在已定义超时值变为零以前,有一个实例管道可以使用,则创建成功并返回管道句柄,并用以侦听来自客户端的连接请求,该功能通过ConnectNamedPipe函数实现。

另一方面,客户端通过函数WaitNamedPipe使服务进程等待来自客户的实例连接,如果在超时值变为零以前,有一个管道可以为连接使用,则WaitNamedPipe将返回True,并通过调用CreateFile或CallNamedPipe来呼叫对服务端的连接。此时服务端将接受客户端的连接请求,成功建立连接,服务端ConnectNamedPipe返回True,客户端CreateFile将返回一指向管道文件的句柄。

从时序上讲,首先是客户端通过WaitNamedPipe使服务端的CreateFile在限时时间内创建实例成功,然后双方通过ConnectNamedPipe和CreateFile成功连接,并返回用以通信的文件句柄,此时双方即可进行通信。

(2)通信实现:建立连接之后,客户端与服务器端即可通过ReadFile和WriteFile,利用得到的管道文件句柄,彼此间进行信息交换。

(3)连接终止:当客户端与服务端的通信结束,或由于某种原因一方需要断开时,客户端应调用CloseFile,而服务端应接着调用DisconnectNamedPipe。当然服务端亦可通过单方面调用DisconnectNamedPipe终止连接。最后应调用函数CloseHandle来关闭该管道。

命名管道服务器端和客户端代码实现

客户端

HANDLE CltHandle;

char pipenamestr[30];

sprintf(pipenamestr,″\\servername\pipe\pipename″)

if (WaitNamedPipe( pipenamestr, NMPWAIT—WAIT—FOREVER)==FALSE

// 管道名要遵循UNC,格式为\ \.\pipe\pipname,名字不分大小写。

AfxMessageBox(″操作失败,请确定服务端正确建立管道实例!″);

Else

CltHandle=CreateFile(pipenamestr, GENERIC—READ|GENERIC—WRITE, FILE—SHARE—READ| FILE—SHARE—WRITE,NULL, OPEN—EXISTING,

//为了与命名管道连接,此参数应一直为OPEN—EXISTING

FILE—ATTRIBUTE—ARCHIVE|FILE—FLAG—WRITE—THROUGH,

// FILE—FLAG—WRITE—THROUGH会使管道WriteFile调用处于阻塞状态,直到数据传送成功。

NULL);

If (CltHandle== INVALID—HANDLE—VALUE)

AfxMessageBox(″管道连接失败″);

Else

DoUsertTransactInfo();

//执行用户自定义信息交换函数——从管道读、写信息。

……

服务端

HANDLE SvrHandle;

char pipenamestr[30];

sprintf(pipenamestr,″\\.\pipe\pipename″)

SvrHandle=CreateNamedPipe(pipenamestr,

PIPE—ACCESS—DUPLEX|FILE—FLAG—WRITE—THROUGH,

//阻塞模式,这种模式仅对″字节传输管道″操作有效。

FILE—WAIT|PIPE—TYPE—BYTE,

//字节模式

PIPE—UNLIMITED—INSTANCES,

128,128,

NULL,NULL);

// SECURITY—ATTRIBUTES结构指针,描述一个新管道,确定子进程的继承权,如果为NULL则该命名管道不能被继承。

If (SvrHandle==INVALID—HANDLE—VALUE)

AfxMessageBox(″管道创建失败,请确定客户端提供连接可能!″);

Else

If (ConnectNamedPipe(SvrHandle,NULL)==FALSE)

AfxMessageBox(″建立连接失败!″);

Else

DoUsertTransactInfo();

//用户自定义信息交换函数

……

查看详情

管道操作使用说明

命名管道是由服务器端的进程建立的,管道的命名必须遵循特定的命名方法,就是 "\\.\pipe\管道名",当作为客户端的进程要使用时,使用"\\计算机名\\pipe\管道名" 来打开使用,具体步骤如下:

服务端通过函数 CreateNamedPipe 创建一个命名管道的实例并返回用于今后操作的句柄,或为已存在的管道创建新的实例。 服务端侦听来自客户端的连接请求,该功能通过 ConnectNamedPipe 函数实现。 客户端通过函数 WaitNamedPipe 来等待管道的出现,如果在超时值变为零以前,有一个管道可以使用,则 WaitNamedPipe 将返回 True,并通过调用 CreateFile 或 CallNamedPipe 来呼叫对服务端的连接。 此时服务端将接受客户端的连接请求,成功建立连接,服务端 ConnectNamedPipe 返回 True 建立连接之后,客户端与服务器端即可通过 ReadFile 和 WriteFile,利用得到的管道文件句柄,彼此间进行信息交换。 当客户端与服务端的通信结束,客户端调用 CloseFile,服务端接着调用 DisconnectNamedPipe。最后调用函数CloseHandle来关闭该管道。 由于命名管道使用时作为客户端的程序必须知道管道的名称,所以更多的用在同一"作者"编写的服务器/工作站程序中,你不可能随便找出一个程序来要求它和你写的程序来通过命名管道通信。而匿名管道的使用则完全不同,它允许你和完全不相干的进程通信,条件是这个进程通过控制台"console"来输入输出,典型的例子是老的 Dos 应用程序,它们在运行时 Windows 为它们开了个 Dos 窗口,它们的输入输出就是 console 方式的。还有一些标准的 Win32 程序也使用控制台输入输出,如果在 Win32 编程中不想使用图形界面,你照样可以使用 AllocConsole 得到一个控制台,然后通过 GetStdHandle 得到输入或输出句柄,再通过 WriteConsole 或 WriteFile 把结果输出到控制台(通常是一个象 Dos 窗口)的屏幕上。虽然这些程序看起来象 Dos 程序,但它们是不折不扣的 Win32 程序,如果你在纯 Dos 下使用,就会显示"The program must run under Windows!"。

一个控制台有三个句柄:标准输入、标准输出和和标准错误句柄,标准输入、标准输出句柄是可以重新定向的,你可以用匿名管道来代替它,这样一来,你可以在管道的另一端用别的进程来接收或输入,而控制台一方并没有感到什么不同,就象 Dos 下的 > 或者 < 可以重新定向输出或输入一样。通常控制台程序的输入输出如下:

(控制台进程output) write ----> 标准输出设备(一般是屏幕)

(控制台进程input) read <---- 标准输入设备(一般是键盘)

而用管道代替后:

(作为子进程的控制台进程output) write ----> 管道1 ----> read (父进程)

(作为子进程的控制台进程input) read <----> 管道2 <---- write (父进程)

使用匿名管道的步骤如下:

使用 CreatePipe 建立两个管道,得到管道句柄,一个用来输入,一个用来输出 准备执行控制台子进程,首先使用 GetStartupInfo 得到 StartupInfo 使用第一个管道句柄代替 StartupInfo 中的 hStdInput,第二个代替 hStdOutput、hStdError,即标准输入、输出、错误句柄 使用 CreateProcess 执行子进程,这样建立的子进程输入和输出就被定向到管道中 父进程通过 ReadFile 读第二个管道来获得子进程的输出,通过 WriteFile 写第一个管道来将输入写到子进程 父进程可以通过 PeekNamedPipe 来查询子进程有没有输出 子进程结束后,要通过 CloseHandle 来关闭两个管道。 下面是具体的说明和定义:

1. 建立匿名管道使用 CreatePipe 原形如下:

BOOL CreatePipe(

PHANDLE hReadPipe, // address of variable for read handle

PHANDLE hWritePipe, // address of variable for write handle

LPSECURITY_ATTRIBUTES lpPipeAttributes, // pointer to security attributes

DWORD nSize // number of bytes reserved for pipe

);

当管道建立后,结构中指向的 hReadPipe 和 hWritePipe 可用来读写管道,当然由于匿名管道是单向的,你只能使用其中的一个句柄,参数中的 SECURITY_ATTRIBUTES 的结构必须填写,定义如下:

typedef struct_SECURITY_ATTRIBUTES{

DWORD nLength: //定义以字节为单位的此结构的长度

LPVOID lpSecurityDescriptor; //指向控制这个对象共享的安全描述符,如果为NULL这个对象将被分配一个缺省的安全描述

BOOL bInheritHandle; //当一个新过程被创建时,定义其返回是否是继承的.供系统API函数使用.

}SECURITY_ATTRIBUTES;

2. 填写创建子进程用的 STARTUPINFO 结构,一般我们可以先用 GetStartupInfo 来填写一个缺省的结构,然后改动我们用得到的地方,它们是:

hStdInput -- 用其中一个管道的 hWritePipe 代替 hStdOutput、hStdError -- 用另一个管道的 hReadPipe 代替 dwFlags -- 设置为 STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW 表示输入输出句柄及 wShowWindow 字段有效 wShowWindow -- 设置为 SW_HIDE,这样子进程执行时不显示窗口。 填写好以后,就可以用 CreateProcess 来执行子进程了,具体有关执行子进程的操作可以参考上一篇教程《进程控制》

3. 在程序中可以用 PeekNamedPipe 查询子进程有没有输出,原形如下:

BOOL PeekNamedPipe(

HANDLE hNamedPipe, // handle to pipe to copy from

LPVOID lpBuffer, // pointer to data buffer

DWORD nBufferSize, // size, in bytes, of data buffer

LPDWORD lpBytesRead, // pointer to number of bytes read

LPDWORD lpTotalBytesAvail, // pointer to total number of bytes available

LPDWORD lpBytesLeftThisMessage // pointer to unread bytes in this message

);

我们可以将尝试读取 nBuffersize 大小的数据,然后可以通过返回的 BytesRead 得到管道中有多少数据,如果不等于零,则表示有数据可以读取。

4. 用 ReadFile 和 WriteFile 来读写管道,它们的参数是完全一样的,原形如下:

ReadFile or WriteFile(

HANDLE hFile, // handle of file to read 在这里使用管道句柄

LPVOID lpBuffer, // address of buffer that receives data 缓冲区地址

DWORD nNumberOfBytesToRead, // number of bytes to read 准备读写的字节数

LPDWORD lpNumberOfBytesRead, // address of number of bytes read,实际读到的或写入的字节数

LPOVERLAPPED lpOverlapped // address of structure for data 在这里用 NULL

);

5. 用 CloseHandle 关闭管道一和管道二的 hReadPipe和 hWritePipe 这四个句柄。

下面给出了一个例子程序,这个程序是上篇教程《进程控制》的例子的扩充,如果你对有的 api 感到陌生的话,请先阅读上一篇教程。

查看详情

相关推荐

立即注册
免费服务热线: 400-888-9639