2009-11-06 3 views
2

Чтобы временно перенаправить stdout в файл, я делаю:freopen_s на стандартный вывод вызывает проблемы с GetConsoleScreenBufferInfo на ОС Windows

printf("Before"); 
freopen_s(&stream, "test.txt", "w", stdout); 
printf("During"); 
freopen_s(&stream, "CONOUT$", "w", stdout); 
printf("After"); 

Это работает, но не делает:

CONSOLE_SCREEN_BUFFER_INFO sbi = {0}; 
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi); 

Нет больше похоже на работу , Он возвращает false, а GetLastError() возвращает 6, что переводится как сообщение «Ручка недействительна». с FormatMessage.

Любые советы о том, почему дескриптор может быть недействительным? Интересно, что printf продолжает работать так, как ожидалось, и SetConsoleTextAttribute работает даже с тем же ручкой.

ответ

4

я обнаружил следующее here:

hConsoleOutput [в]

Дескриптор экранного буфера консоли. Ручка должна иметь право доступа GENERIC_READ. Дополнительные сведения см. В разделе Безопасность и права доступа к буферу консоли.

Таким образом, я бы ожидать, что доступ к возобновлять бы восстановить ожидаемую функциональность, например, при добавлении следующего содержания:

printf("Before"); 
freopen_s(&stream, "test.txt", "w", stdout); 
printf("During"); 
freopen_s(&stream, "CONOUT$", "w+", stdout); 
printf("After"); 
+0

Это фиксированная моя проблема. Благодаря! – Sydius