c++ - 命名管道中没有字节

标签 c++ winapi named-pipes

服务: 在命名管道中创建 std out,err,in。将它们附加到它创建的进程。

HANDLE hStdOut = CreateNamedPipe(szStdOutPipeName,
            PIPE_ACCESS_DUPLEX,
            PIPE_TYPE_BYTE,
            1,
            100,
            100,
            15000,
            pSa);
yStartupInfo.hStdOutput = hStdOut;
CreateProcessAsUserW( ..., yStartupInfo, ... );

这部分有效。创建的进程的输出被重定向到管道中。

客户: 连接到命名管道,成功。检查是否有要读取的字节(此时字节被插入管道!)。然后从管道中读取字节。

hStdOutPide = CreateFileW(szPipeNameStdOut,
                          GENERIC_READ|GENERIC_WRITE,
                          FILE_SHARE_READ|FILE_SHARE_WRITE,
                          NULL, 
                          OPEN_EXISTING, 
                          0, 
                          NULL );
PeekNamedPipe(hStdOutPide,
              szBuffer,
              kunBufferSize,
              &ulBytesRead,
              &ulBytesAvailable,
              &ulRemainingBytes);
if( ulBytesAvailable > 0)
      ReadFile(hStdOutPide, szBuffer, 1000, &ulBytesRead, NULL)

我已经删除了确保句柄有效和进程正在运行等的周围代码。

Peek 显示 ulRemainingBytesALWAYS 0。有人看到我的错误可能在哪里吗?一段时间以来,我一直在努力让它发挥作用,但我不知道任何东西的正确标志是什么了。如果您需要更多信息,请询问!

CreateNamesPipe 中的安全属性是从一个方法生成的。它在代码中的许多其他地方使用,所以我认为问题不在那里。

谢谢。

最佳答案

PeekNamedPipe() 返回应检查的 BOOL

如果失败(FALSE0),使用 GetLastError() 找出原因。

在此之前,您还应该根据 INVALID_HANDLE_VALUE 检查 CreateFile() (hStdOutPide) 的返回值。如果返回的句柄无效,这很可能是 PeekNamedPipe() 失败的原因。

总而言之,您似乎取得了太多(好的)结果。不!检查您的返回代码,切勿依赖运气。

还有一件事:共享标志可能设置不当。确保它们不会与您想要做的事情发生冲突。无论哪种方式,GetLastError() 都会在 CreateFile() 失败的情况下再次告诉您此类问题。

关于c++ - 命名管道中没有字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854091/

相关文章:

c++ - 为什么ostream_iterator需要显式声明要输出的对象类型?

c - 在 ANSI C 中使用 WinAPI 和 DWMApi

c++ - 使用 Win32 C++ 访问 protected 网络共享

go - 在 Go 中读取命名管道时 100% CPU 使用率

sql-server - SQL Server 2005 - 同时启用命名管道和 TCP/IP 协议(protocol)?

winapi - 无缓冲 CreateNamedPipe 用作 CreateProcess 的标准输出

c++ - 使用 Mysql 连接器构建应用程序时出错

c++ - 我想确认我对变量作用域的理解在 C++ 中是正确的

c++ - 如何制作一个给出 45 天后日期的程序

python - 如何使用 pywin32 和 WMI 设置进程优先级?