如何在窗口中重定向 std::cout 和 printf
How to redirect std::cout and printf in windows
>我根据这篇文章创建了程序 使用重定向输入和输出创建子进程,但它不起作用 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;
之前
相关文章:
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- C++ Setter/Getter,cout 工作,printf 失败
- 0x%08lx 格式说明符在 printf 语句到 cout
- cout 打印不准确的结果,printf 打印准确的结果
- 为什么 printf 在 C++ 中的执行速度比 cout 快?另外scanf比cin慢,为什么?
- C++, printf vs cout performance
- printf() 和 std::cout 在指针方面的区别
- C++将printf更改为cout
- 为什么printf会导致与future.get的死锁,而cout则不会?
- 为什么printf和cout为此无符号int提供了不同的输出
- 为什么在 c++ 中使用 ios::sync_with_stdio(false) 后在 cout 之前执行 printf
- 在CPP的COUT中等效的printf格式
- printf 整数显示超过 C++ cout
- 为什么 CIN / COUT 比 scanf/printf 慢
- 要在不使用cout的情况下打印某些内容,请使用printf或puts()
- 执行叉()时cout vs printf
- 如何将COUT/CINS转换为printf/scanfs
- 将printf语句转换为cout
- 如何在不使用cout/printf的情况下输出文本在cpp和c中
- 如何在纯 C/C++ (cout/printf) 中显示进度指示器