TransactNamedPipe功能将单个网络操作组合到从指定的命名管道写入消息并从其读取消息的功能。
BOOL TransactNamedPipe(
HANDLE 【hNamedPipe】, | //命名管道的句柄 |
LPVOID 【lpInBuffer】, | //写入缓冲区的地址 |
DWORD 【nInBufferSize】, | //写入缓冲区的大小(以字节为单位) |
LPVOID 【lpOutBuffer】, | //读缓冲区的地址 |
DWORD 【nOutBufferSize】, | //读缓冲区的大小,以字节为单位 |
LPDWORD 【lpBytesRead】, | //实际读取字节的变量地址 |
LPOVERLAPPED 【lpOverlapped的】 | //重叠结构的地址 |
); |
参数
【hNamedPipe】
标识CreateNamedPipe或CreateFile函数返回的命名管道。
【lpInBuffer】
指向包含写入管道的数据的缓冲区。
【nInBufferSize】
指定写缓冲区的大小(以字节为单位)。
【lpOutBuffer】
指向接收从管道读取的数据的缓冲区。
【nOutBufferSize】
指定读取缓冲区的大小(以字节为单位)。
【lpBytesRead】
指向接收从管道读取的字节数的变量。
如果【lpOverlapped的】为NULL,则【lpBytesRead】不能为NULL。
如果【lpOverlapped的】不为NULL,则【lpBytesRead】可以为NULL。如果这是一个重叠的读操作,可以通过调用GetOverlappedResult获取读取的字节数。如果【hNamedPipe】与I / O完成端口相关联,则可以通过调用GetQueuedCompletionStatus获取读取的字节数。
【lpOverlapped的】
指向OVERLAPPED结构。如果使用FILE_FLAG_OVERLAPPED打开【hNamedPipe】,则此结构是必需的。
如果使用FILE_FLAG_OVERLAPPED打开【hNamedPipe】,则【lpOverlapped的】参数不能为NULL。它必须指向一个有效的OVERLAPPED结构。如果【hNamedPipe】使用FILE_FLAG_OVERLAPPED创建,并且【lpOverlapped的】为NULL,则该函数可能会错误地报告该操作是否完成。
如果使用FILE_FLAG_OVERLAPPED打开【hNamePipe】,并且【lpOverlapped的】不为NULL,则TransactNamedPipe作为重叠操作执行。OVERLAPPED结构应包含手动重置事件对象(可以使用CreateEvent功能创建)对象。如果操作无法立即完成,TransactNamedPipe返回FALSE,GetLastError返回ERROR_IO_PENDING。在这种情况下,在TransactNamedPipe返回之前,将事件对象设置为非信号状态,并且在事务完成时将事件对象设置为信号状态。有关重叠操作的详细信息,请参阅管道.
如果【hNamedPipe】未使用FILE_FLAG_OVERLAPPED打开,则TransactNamedPipe在操作完成之前不会返回。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
如果服务器没有创建管道作为消息类型管道,或管道句柄不处于消息读取模式,TransactNamedPipe将失败。例如,如果客户端在与服务器相同的机器上运行,并使用\\\\。\\管\\ 【\\管\\】格式打开管道,则管道将以命名管道文件系统(NPFS)的字节模式打开。如果客户端使用形式\\ 【服务器】 \\管\\ 【\\管\\】,则重定向器将以消息模式打开管道。使用SetNamedPipeHandleState功能,可以将字节模式管道句柄更改为消息读取模式。
在数据写入【lpOutBuffer】参数指定的缓冲区之前,该函数无法成功完成。参数【lpOverlapped的】可用于在后台执行操作时使呼叫线程执行其他任务。
如果要读取的消息长于【nOutBufferSize】参数指定的缓冲区,则TransactNamedPipe返回FALSE,并且GetLastError函数返回ERROR_MORE_DATA。消息的其余部分可以通过后续调用ReadFile ReadFileEx或PeekNamedPipe来读取。
也可以看看
CreateEvent, CreateFile, CreateNamedPipe, GetOverlappedResult, GetQueuedCompletionStatus, PeekNamedPipe, ReadFile, ReadFileEx, SetNamedPipeHandleState, OVERLAPPED