Возможно ли каким-то образом изменить стандартные функции ввода-вывода в Windows? Предпочитаемый язык - это C++. Если я правильно понимаю, выбрав консольный проект, компилятор просто предварительно выделит консоль для вас и будет работать со всеми стандартными функциями ввода-вывода для работы с его дескриптором. Итак, я хочу, чтобы одно приложение Console фактически записывало в другой буфер консоли Консоли. Хотя я мог бы получить первый консольный дескриптор, чем передать его второму приложению файлом (я не очень разбираюсь в межпроцессной коммуникации, и это кажется простым), а чем-то использовать, например, prinf с первым дескриптором приложения. Это можно сделать? Я знаю, как получить консольный дескриптор, но я не знаю, как перенаправить printf на этот дескриптор. Его справедливый учебный проект, чтобы больше понять работу ОС за этим. Меня интересует, как printf знает, с чем связана консоль.Изменить значение по умолчанию Функции консоли ввода-вывода консоли
ответ
Если я правильно понял, вы можете найти исходный код приложения, которое вы хотите написать в http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx. В этом примере показано, как писать в stdin
другого приложения и читать его stdout
.
Для общего понимания. Компилятор не «предварительно назначает вам консоль». Компилятор использует стандартные библиотеки 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).
Если вы хотите перенаправить printf
к ручке (FILE *), просто сделать
fprintf(handle, "...");
Например тиражирование printf
с fprintf
fprintf(stdout, "...");
Или отчеты об ошибках
fprintf(stderr, "FATAL: %s fails", "smurf");
Это также то, как вы пишете файлы. fprintf(file, "Blah.");
Если я вас правильно понимаю, это звучит, как вы хотите, чтобы функция API для Windows AttachConsole(pid)
, который крепит текущий процесс в консоли, принадлежащей процессу с ПИД pid
.
Я думаю, что ты прав. http://msdn.microsoft.com/en-us/library/ms681952%28VS.85%29.aspx – dss539
- 1. Rails консоли окружения по умолчанию
- 2. Переопределить текст справки консоли по умолчанию
- 3. Исключительный цвет консоли консоли Eclipse
- 4. Borland C++ функции консоли
- 5. Как изменить шрифт консоли?
- 6. Цвет текста окна консоли по умолчанию
- 7. Ошибка консоли консоли JS
- 8. PyCharm изменить рабочий каталог консоли
- 9. Изменить цвет текста консоли
- 10. изменить цвет консоли в C++
- 11. Изменить шрифт консоли в Windows
- 12. Изменить цвет консоли дочернего процесса
- 13. Значение ошибки консоли?
- 14. Изменение уровня запуска консоли по умолчанию при загрузке
- 15. Программно изменить 16-значные цвета консоли PowerShell
- 16. Eclipse - изменить цвет фона консоли
- 17. Размер по умолчанию в веб-консоли Firefox - что происходит?
- 18. WinApi - Как изменить окно консоли?
- 19. Синтаксис консоли dql консоли?
- 20. Изменить значение по умолчанию EnableViewState
- 21. Шрифты на консоли последовательной консоли и буферизатора
- 22. кратчайший способ изменить уровень журнала консоли django
- 23. Как изменить номер порта консоли Couchbase
- 24. Как изменить значение по умолчанию функции с помощью другой функции?
- 25. C++ создание консоли: привязка функции
- 26. Как изменить внешний вид консоли?
- 27. Изменить размер события для консоли
- 28. Как изменить размер шрифта консоли
- 29. Как изменить шрифт консоли vimrc
- 30. Изменить пароль консоли администрирования в Jboss
Спасибо. Итак, fprintf является перенаправляемым printf? И как printf знает, какая консоль является дефолтом? –
printf по умолчанию принимает значение, на которое ссылается «stdout», стандартный вывод. В основном консоль, или если вы перенаправляете («yourprogram> output.txt») перенаправленный файл. – LukeN