c++ - 如何读取控制台应用程序的输出?

标签 c++ winapi

我有一个 3rd 方控制台应用程序,它打印几行并立即退出(或等待按下一个键以关闭 - 取决于使用的参数)。我想从我自己的控制台程序运行这个应用程序并将其输出到我的缓冲区中。我已经尝试过这种方法,但它不起作用:

....    
HANDLE stdRead, stdWrite;
SECURITY_ATTRIBUTES PipeSecurity;
ZeroMemory (&PipeSecurity, sizeof (SECURITY_ATTRIBUTES));
PipeSecurity.nLength = sizeof (SECURITY_ATTRIBUTES);
PipeSecurity.bInheritHandle = true;
PipeSecurity.lpSecurityDescriptor = NULL;

CreatePipe (&stdRead, &stdWrite, &PipeSecurity, NULL)

STARTUPINFO sinfo;
ZeroMemory (&sinfo, sizeof (STARTUPINFO));
sinfo.cb = sizeof (STARTUPINFO);
sinfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
sinfo.hStdInput = stdWrite;
sinfo.hStdOutput = stdRead;
sinfo.hStdError = stdRead;
sinfo.wShowWindow = SW_SHOW;
CreateProcess (NULL, CommandLine, &PipeSecurity, &PipeSecurity, TRUE, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &sinfo, &pi))

DWORD dwRetFromWait= WAIT_TIMEOUT;
while (dwRetFromWait != WAIT_OBJECT_0)
{
    dwRetFromWait = WaitForSingleObject (pi.hProcess, 10);
    if (dwRetFromWait == WAIT_ABANDONED)
        break;

    //--- else (WAIT_OBJECT_0 or WAIT_TIMEOUT) process the pipe data
    while (ReadFromPipeNoWait (stdRead, Buffer, STD_BUFFER_MAX) > 0)
    {
        int iLen= 0; //just for a breakpoint, it never breaks here
    }
}
....


int ReadFromPipeNoWait (HANDLE hPipe, WCHAR *pDest, int nMax)
{
DWORD nBytesRead = 0;
DWORD nAvailBytes;
WCHAR cTmp [10];

ZeroMemory (pDest, nMax * sizeof (WCHAR));
// -- check for something in the pipe
PeekNamedPipe (hPipe, &cTmp, 20, NULL, &nAvailBytes, NULL);
if (nAvailBytes == 0)
    return (nBytesRead); //always ends here + cTmp contains crap

// OK, something there... read it
ReadFile (hPipe, pDest, nMax-1, &nBytesRead, NULL); 

return nBytesRead;
}

如果我删除 PeekNamedPipe,它只会卡在 ReadFile 上,什么都不做。任何想法可能有什么问题?不幸的是,管道不是我的菜,我只是整理了一些在 Internet 上找到的代码。

非常感谢。

最佳答案

我将从一个简单的方法开始:

char tmp[1024];
std::string buffer;

FILE *child = _popen("child prog.exe", "r");

if (NULL == child)
    throw std::runtime_error("Unable to spawn child program");

while (fgets(tmp, sizeof(tmp), child))
   buffer += tmp;

只有当你发现这不起作用时,才做一些更复杂的事情来解决你遇到的具体问题。

关于c++ - 如何读取控制台应用程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802948/

相关文章:

.NET 远程处理和 Delphi win32

c# - 在没有 NativeMethods 的情况下,如何找到给定 hWnd 的窗口的位置/位置?

c - Win32 在当前控制台执行子进程并退出而不返回父进程

c++ - 这个‘type variableofType()’是函数还是对象?

c++ - 检查派生中基类的模板参数

c++ - 如何将编译时 std::array "expand"放入参数包中?

winapi - IDirectSoundBuffer锁,为什么要传递2部分?

c++ - 将组件添加到从代码中使用 qt creator 创建的布局

c++ - 为什么 stdlib 中的 rand 不遵循大数定律?

c++ - 是否有 winapi 调用可以在控制台中设置颜色,如 'color xx' 命令?