Если я правильно вас понял, вы можете найти исходный код приложения, которое вы хотите написать, в http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx.. В этом примере показано, как написать stdin
другого приложения и прочитать его stdout
. * 1005. *
Для общего понимания. Компилятор не «предварительно выделяет консоль для вас». Компилятор использует стандартные библиотеки C / C ++, которые записывают в вывод. Так, если вы используете, например, printf()
, следующий код будет выполнен в конце и будет выглядеть так:
void Output (PCWSTR pszwText, UINT uTextLenght) // uTextLenght is Lenght in charakters
{
DWORD n;
UINT uCodePage = GetOEMCP(); // CP_OEMCP, CP_THREAD_ACP, CP_ACP
PSTR pszText = _alloca (uTextLenght);
// in the console are typically not used UNICODE, so
if (WideCharToMultiByte (uCodePage, 0, pszwText, uTextLenght,
pszText, uTextLenght, NULL, NULL) != (int)uTextLenght)
return;
WriteFile (GetStdHandle (STD_OUTPUT_HANDLE), pszText, uTextLenght, &n, NULL);
//_tprintf (TEXT("%.*ls"), uTextLenght, pszText);
//_puttchar();
//fwrite (pszText, sizeof(TCHAR), uTextLenght, stdout);
//_write (
}
Таким образом, если изменить значение STD_OUTPUT_HANDLE
, все выходные данные будут направлены в файл / канал и так далее. Если вместо WriteFile
программа использует функцию WriteConsole
, такое перенаправление не будет работать, но стандартная библиотека C / C ++ этого не делает.
Если вы хотите перенаправить stdout
не из дочернего процесса, а из текущего процесса, вы можете вызвать SetStdHandle()
напрямую (см. http://msdn.microsoft.com/en-us/library/ms686244%28VS.85%29.aspx).
«Распределение консоли» делает загрузчик операционной системы. Он просматривает слово бинарного EXE-файла (в части «Подсистема» IMAGE_OPTIONAL_HEADER
см. http://msdn.microsoft.com/en-us/library/ms680339%28VS.85%29.aspx), и если в этом месте у EXE 3 (IMAGE_SUBSYSTEM_WINDOWS_CUI
), чем он использует консоль родительского процесса или создает новый. Это поведение можно немного изменить в параметрах вызова CreateProcess
(но только если вы запускаете дочерний процесс в своем коде). Это Subsystem
флаг EXE, который вы определяете в отношении переключателя / подсистемы компоновщика (см. http://msdn.microsoft.com/en-us/library/fcc1zstk%28VS.80%29.aspx).