当 运行 来自控制台时从 WinMain 管道控制台输出
Piping console output from WinMain when running from a console
我正在尝试通过控制台从 VCL 表单应用程序中的 WinMain 函数传输标准输出。
特别是,我需要在控制台中执行此操作:
mywinprogram.exe -v > toMyFile.txt
其中 -v 代表版本。传递的信息只是应用程序的版本。
我可以使用此处的答案将输出 输出到 控制台:
How do I get console output in C++ with a Windows program?
但是无法将输出通过管道传输到文件。
在没有任何参数的情况下启动时,应用程序的行为应该类似于 'normal' windows 应用程序。
以这种方式获取信息的能力是为了自动构建系统的工作。
这是我在 Sev 的回答中找到的版本。
首先调用此函数。_tWinMain()
:
#include <cstdio>
#include <fcntl.h>
#include <io.h>
void RedirectIOToConsole() {
if (AttachConsole(ATTACH_PARENT_PROCESS)==false) return;
HANDLE ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
int SystemOutput = _open_osfhandle(intptr_t(ConsoleOutput), _O_TEXT);
// check if output is a console and not redirected to a file
if(isatty(SystemOutput)==false) return; // return if it's not a TTY
FILE *COutputHandle = _fdopen(SystemOutput, "w");
// Get STDERR handle
HANDLE ConsoleError = GetStdHandle(STD_ERROR_HANDLE);
int SystemError = _open_osfhandle(intptr_t(ConsoleError), _O_TEXT);
FILE *CErrorHandle = _fdopen(SystemError, "w");
// Get STDIN handle
HANDLE ConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
int SystemInput = _open_osfhandle(intptr_t(ConsoleInput), _O_TEXT);
FILE *CInputHandle = _fdopen(SystemInput, "r");
//make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
ios::sync_with_stdio(true);
// Redirect the CRT standard input, output, and error handles to the console
freopen_s(&CInputHandle, "CONIN$", "r", stdin);
freopen_s(&COutputHandle, "CONOUT$", "w", stdout);
freopen_s(&CErrorHandle, "CONOUT$", "w", stderr);
//Clear the error state for each of the C++ standard stream objects.
std::wcout.clear();
std::cout.clear();
std::wcerr.clear();
std::cerr.clear();
std::wcin.clear();
std::cin.clear();
}
我正在尝试通过控制台从 VCL 表单应用程序中的 WinMain 函数传输标准输出。
特别是,我需要在控制台中执行此操作:
mywinprogram.exe -v > toMyFile.txt
其中 -v 代表版本。传递的信息只是应用程序的版本。
我可以使用此处的答案将输出 输出到 控制台: How do I get console output in C++ with a Windows program?
但是无法将输出通过管道传输到文件。
在没有任何参数的情况下启动时,应用程序的行为应该类似于 'normal' windows 应用程序。
以这种方式获取信息的能力是为了自动构建系统的工作。
这是我在 Sev 的回答中找到的版本。
首先调用此函数。_tWinMain()
:
#include <cstdio>
#include <fcntl.h>
#include <io.h>
void RedirectIOToConsole() {
if (AttachConsole(ATTACH_PARENT_PROCESS)==false) return;
HANDLE ConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
int SystemOutput = _open_osfhandle(intptr_t(ConsoleOutput), _O_TEXT);
// check if output is a console and not redirected to a file
if(isatty(SystemOutput)==false) return; // return if it's not a TTY
FILE *COutputHandle = _fdopen(SystemOutput, "w");
// Get STDERR handle
HANDLE ConsoleError = GetStdHandle(STD_ERROR_HANDLE);
int SystemError = _open_osfhandle(intptr_t(ConsoleError), _O_TEXT);
FILE *CErrorHandle = _fdopen(SystemError, "w");
// Get STDIN handle
HANDLE ConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
int SystemInput = _open_osfhandle(intptr_t(ConsoleInput), _O_TEXT);
FILE *CInputHandle = _fdopen(SystemInput, "r");
//make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well
ios::sync_with_stdio(true);
// Redirect the CRT standard input, output, and error handles to the console
freopen_s(&CInputHandle, "CONIN$", "r", stdin);
freopen_s(&COutputHandle, "CONOUT$", "w", stdout);
freopen_s(&CErrorHandle, "CONOUT$", "w", stderr);
//Clear the error state for each of the C++ standard stream objects.
std::wcout.clear();
std::cout.clear();
std::wcerr.clear();
std::cerr.clear();
std::wcin.clear();
std::cin.clear();
}