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