Currently, I am working on a code in C++, where I am using WriteConsoleW to display texts on the console screen. However, the challenge is in extracting this output from the console and displaying it on another console, as shown in the images below:
Any tips on how to capture output from WriteConsoleW and the program would be greatly appreciated.
The base code:
#include <iostream>
#include <Windows.h>
int main() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole == INVALID_HANDLE_VALUE) {
std::cerr << "Error in handle console" << std::endl;
return 1;
}
// Texto a ser escrito
const wchar_t* texto = L"Hello, Word!";
DWORD escritos;
// Escreve o texto no console
if (!WriteConsoleW(hConsole, texto, wcslen(texto), &escritos, nullptr)) {
std::cerr << "Write Error" << std::endl;
return 1;
}
system("pause");
return 0;
}
The code where the problem is occurring:
#include <windows.h>
#include <iostream>
#include <string>
void ErrorExit(const char* msg) {
std::cerr << msg << std::endl;
ExitProcess(1);
}
int main() {
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD fdwOldMode, fdwMode;
GetConsoleMode(hStdIn, &fdwOldMode);
fdwMode = fdwOldMode ^ ENABLE_MOUSE_INPUT ^ ENABLE_WINDOW_INPUT;
SetConsoleMode(hStdIn, fdwMode);
FlushConsoleInputBuffer(hStdIn);
HANDLE hChildStd_OUT_Rd, hChildStd_OUT_Wr;
SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES), TRUE, nullptr };
if (!CreatePipe(&hChildStd_OUT_Rd, &hChildStd_OUT_Wr, &saAttr, 0) ||
!SetHandleInformation(hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0)) {
ErrorExit("Error creating pipe or setting handle information.");
}
STARTUPINFO siStartInfo = { sizeof(STARTUPINFO) };
siStartInfo.hStdError = hChildStd_OUT_Wr;
siStartInfo.hStdOutput = hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
const char* exePath = "a.exe";
PROCESS_INFORMATION piProcInfo;
if (!CreateProcess(NULL, const_cast<char*>(exePath), NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo)) {
ErrorExit("Error creating process.");
}
CloseHandle(hChildStd_OUT_Wr);
const int bufferSize = 4096;
char buffer[bufferSize];
DWORD bytesRead;
std::string result = "";
WaitForSingleObject(piProcInfo.hProcess, INFINITE);
while (true) {
if (!ReadFile(hChildStd_OUT_Rd, buffer, bufferSize, &bytesRead, NULL) || bytesRead == 0) {
break;
}
result.append(buffer, bytesRead);
}
CloseHandle(hChildStd_OUT_Rd);
std::cout << "Output from a.exe:" << std::endl;
std::cout << result << std::endl;
std::cout << "Press Enter to exit...";
std::string inStr;
std::getline(std::cin, inStr);
SetConsoleMode(hStdIn, fdwOldMode);
return 0;
}
2