freopen_s auf stdout verursacht Probleme mit GetConsolesCreenBufferinfo unter Windows
Frage
Vorübergehend umleiten stdout
Zu einer Datei mache ich:
printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w", stdout);
printf("After");
Das funktioniert jedoch:
CONSOLE_SCREEN_BUFFER_INFO sbi = {0};
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi);
Scheint nicht mehr zu funktionieren. Es gibt falsch zurück und GetLastError()
kehrt zurück 6
Dies führt in die Nachricht "Das Handle ist ungültig". mit FormatMessage
.
Irgendwelche Ratschläge, warum der Griff ungültig sein könnte? Interessant, printf
funktioniert weiter wie erwartet und SetConsoleTextAttribute
funktioniert sogar mit dem gleichen Griff.
Lösung
Ich entdeckte Folgendes hier:
hconsoleoutput [in
Ein Handle zum Konsolenbildschirmpuffer. Der Griff muss über das richtige Zugriff generic_read haben. Weitere Informationen finden Sie in Sicherheit und Zugriffsrechten der Konsolenpuffer.
Ich würde also erwarten, dass das Hinzufügen von Lesezugriff auf die Reöffnung die erwarteten Funktionalität beispielsweise wiederherstellen würde:
printf("Before");
freopen_s(&stream, "test.txt", "w", stdout);
printf("During");
freopen_s(&stream, "CONOUT$", "w+", stdout);
printf("After");