Бронирование турбазы доступно на сайте http://mirturbaz.ru [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Профессиональное » C / C++ / Qt » Перенаправляем стандартные потоки ввода/вывода (Перенаправляем потоки ввода/вывода средствами WinAPI)
Перенаправляем стандартные потоки ввода/вывода
IGGGORRREKKKДата: Понедельник, 12.10.2009, 18:56 | Сообщение # 1
Дилетант
Группа: Деловоды
Сообщений: 38
Репутация: 10
Статус: Offline
Вопрос:
Как перенаправить стандартные потоки ввода/вывода в приложении средствами 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
 
COBAДата: Вторник, 13.10.2009, 18:53 | Сообщение # 2
Великий админ
Группа: Суровые Одмины
Сообщений: 108
Репутация: 12
Статус: Offline
Спасибо, что поделился!) критик лекций и исследователь прямо))


Без риска победив, без славы торжествуешь...
 
IGGGORRREKKKДата: Вторник, 13.10.2009, 19:51 | Сообщение # 3
Дилетант
Группа: Деловоды
Сообщений: 38
Репутация: 10
Статус: Offline
Тебе ха-ха, а раз 20 все перекомпиливал и дотошно исследовал создаваемый файл) Сычев - #####. Он сам интересно испытывает на работоспособность то, что у него в лекциях или просто тупо переводит MSDN(да еще и неправильно)?


http://lepeshkin.wordpress.com
http://twitter.com/ilepeshkin
 
COBAДата: Вторник, 13.10.2009, 21:50 | Сообщение # 4
Великий админ
Группа: Суровые Одмины
Сообщений: 108
Репутация: 12
Статус: Offline
Quote (IGGGORRREKKK)
Сычев - #####. Он сам интересно испытывает на работоспособность то, что у него в лекциях или просто тупо переводит MSDN(да еще и неправильно)?

Он и так вон сколько лекций понаделал)) и ты сколько по ним учишь..^^ просто ошибся.. замечаешь только плохое типа?))

зато теперь если столкнёмся, будем знать в чём проблема..



Без риска победив, без славы торжествуешь...
 
IGGGORRREKKKДата: Среда, 14.10.2009, 16:41 | Сообщение # 5
Дилетант
Группа: Деловоды
Сообщений: 38
Репутация: 10
Статус: Offline
Quote (COBA)
и ты сколько по ним учишь..

первый раз решил внимательно и подробно прочитать)
Quote (COBA)
Он и так вон сколько лекций понаделал)
Он их делал не с нуля и не за один день. Конкретно по курсу ОС он пользовался лекциями INTUIT. Примеры кода и описание функций он копипастит из MSDN и потом переводит комментарии(как видим не очень удачно)).
К тому же эта ошибка не из разряда случайных опечаток или пропущенных слов(если бы это было так, я бы и внимание не обратил))))
P.S. Честно говоря я когда смотрел описание функции тоже подумал, что она должна работать и по смыслу перевод верный, а на самом деле в WinAPI все немного по-другому устроено.)



http://lepeshkin.wordpress.com
http://twitter.com/ilepeshkin
 
Форум » Профессиональное » C / C++ / Qt » Перенаправляем стандартные потоки ввода/вывода (Перенаправляем потоки ввода/вывода средствами WinAPI)
  • Страница 1 из 1
  • 1
Поиск: