我目前正在开发一个充当命名管道服务器的应用程序。此应用程序仅用于将数据发送到客户端(不是由我编写),但也需要告知管道何时损坏。我对此任务的想法是使用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
答案 0 :(得分:0)
来自API docs:
hNamedPipe [in]信息所在的命名管道的句柄 通缉。句柄必须具有GENERIC_READ访问权限才能进行只读或 读/写管道,或者它必须有GENERIC_WRITE和 FILE_READ_ATTRIBUTES访问只写管道。
如果您仅使用pipe
打开了管道手柄(PIPE_ACCESS_OUTBOUND
),我认为您无法满足此条件。因此ERROR_ACCESS_DENIED
错误。