1

我目前正在开发一个充当命名管道服务器的应用程序。此应用程序仅设计用于将数据发送到客户端(不是我编写的),但还需要在管道损坏时得到通知。我对这项任务的想法是使用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 
4

1 回答 1

1

API 文档

hNamedPipe [in] 需要信息的命名管道的句柄。对于只读或读/写管道,句柄必须具有 GENERIC_READ 访问权限,或者对于只写管道,它必须具有 GENERIC_WRITE 和 FILE_READ_ATTRIBUTES 访问权限。

如果你只用 来打开你的管柄 ( pipe) PIPE_ACCESS_OUTBOUND,我认为你不满足这个条件。因此ERROR_ACCESS_DENIED错误。

于 2013-08-30T08:11:22.643 回答