Вопрос:
Как перенаправить стандартные потоки ввода/вывода в приложении средствами WinAPI? Неправильное решение:
Я решил посмотреть электронные лекции, которые нам выдают. Тема :"Стандартные потоки". При рассмотрении функций WinAPI там упоминается функция SetStdHandle(). Также "как-бы" дано задание открыть файл и перенаправить в него поток вывода. Решение предлагается следующее:
HANDLE hFile = CreateFile("myfile.txt",
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hFile);
Я решил этим воспользоваться. Сделал копипаст, дописал в конце printf("Hello world") и подумал, что все. Не все так просто)) Оказывается это не работает. То есть человек, писавший лекции, сам мало, что в понимает.Потыкавшись несколько раз, просмотрев вдвое больше раз MSDN(2005-статья SetStdHandle), я так и не понял, почему же то, что написано в лекции не работает. Ладно, идем в Bing, ищем решение.
Оно находится по следующему адресу:
http://www.rsdn.ru/forum/winapi/1547519.flat.aspx
Также дано краткое объяснение проблемы:
Проблема в том, что при создании процесса создается HANDLE’s стандартных потоков и их дескрипторы (1,2 и 3). В начале они совпадают, но SetStdHandle переопределяет только HANDLE’s.
После чтения материала и штурма MSDN по поводу подробного механизма работы кода, который дан на RSDN. Получаем, что наше решение должен выглядеть следующим образом:
HANDLE hFile = CreateFile(TEXT("myfile.txt"),
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
HANDLE hOldStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetStdHandle(STD_OUTPUT_HANDLE, hFile);
int old =_dup(1);
int newDescr = _open_osfhandle((intptr_t)hFile, _O_APPEND );
_dup2(newDescr, 1);
printf("Hello world");
Работает)