如何在窗口中重定向 std::cout 和 printf

How to redirect std::cout and printf in windows

本文关键字:cout printf std 重定向 窗口      更新时间:2023-10-16

>我根据这篇文章创建了程序 使用重定向输入和输出创建子进程,但它不起作用 std::cout 和 printf,所以从这样的程序中我得到了 ony "你好,妈妈"字符串,没有来自 cout 和 printf 部分:

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    const char *buffer = "Hello, momma";
    std::cout << buffer << " - iostream versionn";
    printf("%s - stdio version", buffer);
    DWORD dwWritten = 0;
    WriteFile(hStdOut, buffer, strlen(buffer), &dwWritten, NULL);
    return 0;
}

问:如何拦截 cout 和 printf?我无法访问子程序的源代码,只需要拦截它的输出。

<小时 />

这是仅运行子进程时的输出:

你好,妈妈 - iostream 版本

你好,妈妈 - 标准版你好,妈妈

因此,如您所见,所有三个版本都已打印。

<小时 />

根据父程序的要求代码:

void RedirectIO(HANDLE &hRead, HANDLE &hWrite)
{
    SECURITY_ATTRIBUTES attr;
    ZeroMemory(&attr, sizeof(attr));
    attr.nLength = sizeof(attr);
    attr.bInheritHandle = true;
    CreatePipe(&hRead, &hWrite, &attr, 0);
    SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0);
}
bool CreateChild(std::string CommandLine, DWORD WaitTime, HANDLE hInRead, HANDLE hOutWrite)
{
    STARTUPINFO SI;
    PROCESS_INFORMATION PI;
    ZeroMemory(&SI, sizeof(SI));
    ZeroMemory(&PI, sizeof(PI));
    SI.cb = sizeof(SI);
    SI.hStdError = hOutWrite;
    SI.hStdInput = hInRead;
    SI.hStdOutput = hOutWrite;
    SI.dwFlags |= STARTF_USESTDHANDLES;
    bool success = CreateProcess(0, const_cast<char*>(CommandLine.c_str()), 0, 0, true, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, 0, 0, &SI,&PI);
    if (success)
    {
        WaitForSingleObject(PI.hProcess, WaitTime);
        CloseHandle(PI.hProcess);
        CloseHandle(PI.hThread);
    }
    return success;
}
int main()
{
    HANDLE hRead = nullptr;
    HANDLE hWrite = nullptr;
    RedirectIO(hRead, hWrite);
    CreateChild("stdouterrin.exe", INFINITE, nullptr, hWrite);
    DWORD ReadCount = 0;
    char Buffer[1024] = {0};
    std::string data = std::string();
    while(true)
    {
        if (!ReadFile(hRead, Buffer, sizeof(Buffer) / sizeof(char), &ReadCount, 0))
            break;
        if (!ReadCount) break;
        Buffer[ReadCount] = '';
        data.append(&Buffer[0], ReadCount);
        std::cout<<"Read From Child:nn"<<data.c_str()<<"n";
    }
    return 0;
}

您需要刷新缓冲区。

cout << flush;
fflush(stdout);

return 0;之前