命名管道服务器无法获取管道句柄状态

时间:2013-08-28 20:11:46

标签: c++ winapi named-pipes

我目前正在开发一个充当命名管道服务器的应用程序。此应用程序仅用于将数据发送到客户端(不是由我编写),但也需要告知管道何时损坏。我对此任务的想法是使用GetNamedPipeHandleState()来检索管道实例的数量,并查看管道是否仍然驻留在系统中。如果它不再连接,则该程序旨在重置管道,以便客户端可以重新连接并从应用程序中恢复数据。不幸的是,我无法检索管道的实例数量。无论何时进行调用,该函数都会失败,GetLastError()返回ERROR_ACCESS_DENIED。但是,只有在我按如下方式尝试呼叫时才会出现这种情况:

GetNamedPipeHandleStateA(pipe,0,&npipeinstances,0,0,0,0);

如果我按这样调用函数:

GetNamedPipeHandleStateA(pipe,0,0,0,0,0,0);

没有错误发生,但我没有收到任何状态信息。是否有可能缺少的创建参数,或检查此信息的更好方法?

管道的创建代码如下:

pipe=CreateNamedPipeA(pipename,             // name of the pipe
                      PIPE_ACCESS_OUTBOUND, // read/write access 
                      PIPE_TYPE_MESSAGE |   // message type pipe 
                      PIPE_WAIT,            // blocking mode 
                      1,                    // max. instances  
                      65535,                // output buffer size 
                      65535,                // input buffer size 
                      300,                  // client time-out 
                      NULL);                // default security attribute 

1 个答案:

答案 0 :(得分:0)

来自API docs

  

hNamedPipe [in]信息所在的命名管道的句柄   通缉。句柄必须具有GENERIC_READ访问权限才能进行只读或   读/写管道,或者它必须有GENERIC_WRITE和   FILE_READ_ATTRIBUTES访问只写管道。

如果您仅使用pipe打开了管道手柄(PIPE_ACCESS_OUTBOUND),我认为您无法满足此条件。因此ERROR_ACCESS_DENIED错误。