2009-11-06 25 views
2

Pour rediriger temporairement stdout vers un fichier, que je fais:freopen_s sur stdout provoque des problèmes avec GetConsoleScreenBufferInfo sous Windows

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

Cela fonctionne, en faisant cependant:

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

ne semble plus fonctionner . Il renvoie false et GetLastError() renvoie 6, ce qui se traduit par le message "Le handle est invalide". avec FormatMessage.

Un conseil sur la raison pour laquelle la poignée peut être invalide? Fait intéressant, printf continue à fonctionner comme prévu et SetConsoleTextAttribute fonctionne même avec le même handle.

Répondre

4

I ont découvert ce qui suit here:

hConsoleOutput [en]

Une poignée vers la mémoire tampon d'écran de la console. Le handle doit avoir le droit d'accès GENERIC_READ. Pour plus d'informations, consultez Sécurité du tampon de la console et droits d'accès.

Ainsi, j'attendre que l'ajout d'un accès en lecture à la réouverture rétablirait la fonctionnalité attendue, par exemple:

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

qui ont fixé mon problème. Merci! – Sydius