2010-05-12 3 views
0

Возможно ли каким-то образом изменить стандартные функции ввода-вывода в Windows? Предпочитаемый язык - это C++. Если я правильно понимаю, выбрав консольный проект, компилятор просто предварительно выделит консоль для вас и будет работать со всеми стандартными функциями ввода-вывода для работы с его дескриптором. Итак, я хочу, чтобы одно приложение Console фактически записывало в другой буфер консоли Консоли. Хотя я мог бы получить первый консольный дескриптор, чем передать его второму приложению файлом (я не очень разбираюсь в межпроцессной коммуникации, и это кажется простым), а чем-то использовать, например, prinf с первым дескриптором приложения. Это можно сделать? Я знаю, как получить консольный дескриптор, но я не знаю, как перенаправить printf на этот дескриптор. Его справедливый учебный проект, чтобы больше понять работу ОС за этим. Меня интересует, как printf знает, с чем связана консоль.Изменить значение по умолчанию Функции консоли ввода-вывода консоли

ответ

0

Если я правильно понял, вы можете найти исходный код приложения, которое вы хотите написать в 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).

0

Если вы хотите перенаправить printf к ручке (FILE *), просто сделать

fprintf(handle, "..."); 

Например тиражирование printf с fprintf

fprintf(stdout, "..."); 

Или отчеты об ошибках

fprintf(stderr, "FATAL: %s fails", "smurf"); 

Это также то, как вы пишете файлы. fprintf(file, "Blah.");

+0

Спасибо. Итак, fprintf является перенаправляемым printf? И как printf знает, какая консоль является дефолтом? –

+0

printf по умолчанию принимает значение, на которое ссылается «stdout», стандартный вывод. В основном консоль, или если вы перенаправляете («yourprogram> output.txt») перенаправленный файл. – LukeN

1

Если я вас правильно понимаю, это звучит, как вы хотите, чтобы функция API для Windows AttachConsole(pid), который крепит текущий процесс в консоли, принадлежащей процессу с ПИД pid.

+0

Я думаю, что ты прав. http://msdn.microsoft.com/en-us/library/ms681952%28VS.85%29.aspx – dss539

Смежные вопросы