Передача вывода на консоль консоли WinMain при запуске с консоли - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь передать стандартный вывод из функции WinMain, например приложения VCL, из консоли.

В частности, мне нужно сделать это в консоли:

mywinprogram.exe -v > toMyFile.txt 

где -v обозначает версию. Передаваемая информация является просто версией приложения.

Я могу получить вывод на консоли, используя ответ здесь: Как получить вывод консоли в C ++ с Windows программой?

, но передача вывода в файл не работает.

При запуске без каких-либо аргументов приложение должно вести себя как «нормальное» windows приложение.

Возможность получить информацию таким образом предназначена для работы автоматизированной системы сборки.

1 Ответ

0 голосов
/ 21 февраля 2020

Это версия того, что я нашел в ответе Сев .

Вызовите эту функцию первым делом, которое вы делаете. _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();
}
...