服务: 在命名管道中创建std out,err。将它们附加到它创建的过程中。
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)
我删除了周围的代码,确保句柄有效且进程正在运行等等。
The Peek透露ulRemainingBytes
始终 0
。有谁看到我的错误可能在哪里?我一直试图让它工作一段时间,并且不知道什么是适当的标志。请询问您是否需要更多信息!
CreateNamesPipe中的安全属性是从方法生成的。它在代码中的许多其他地方使用,所以我不相信问题存在。
感谢。
答案 0 :(得分:1)
PeekNamedPipe()
会返回应该检查的BOOL
。
如果失败(FALSE
或0
),请使用GetLastError()
找出原因。
在此之前,您还应该针对CreateFile()
检查hStdOutPide
(INVALID_HANDLE_VALUE
)的返回值。如果返回的句柄无效,则可能是PeekNamedPipe()
失败的原因。
总而言之,你似乎采取了太多(好)的结果。别!检查您的退货代码,不要依赖运气。
还有一件事:共享标志可能设置不正确。确保它们与您想要做的事情不冲突。无论哪种方式,GetLastError()
都会在CreateFile()
失败的情况下再次告诉您此类问题。
答案 1 :(得分:0)
我怀疑你是在尝试从stdout读取而不是stdin在你的子进程中。但是从有限的代码我无法证实这一点。有关IPC使用管道的信息,请参阅此问题
How do I take the output of one program and use it as the input of another on C++?