Вопрос: Как перенаправить стандартные потоки ввода/вывода в приложении средствами 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"); Работает)
http://lepeshkin.wordpress.com http://twitter.com/ilepeshkin
|