Hola, estoy escribiendo una pequeña clase para abrir una consola en programas con interfaz gráfica y usarla para emitir información de depuración.
Por comodidad, intento redirigir los flujos de la consola para poder usar cin, cout y cerr en vez de apis para leer y escribir en ella
El código que les presento yo diria que es correcto, pero no se comporta bien en ejecución.
Si hago un cin, ya no escribe nada en pantalla al usar cout. Sólo si uso cerr y escribe todo lo que haya en el buffer.
En vista de estos fallos, uso GetLastError después de hacer cin, y me dice INVALID_HANDLE_VALUE.
No entiendo por qué se cierra el handle.
Edit:
Pruebas hasta ahora sin resultado:
1º Obtener el handles de entrada, salida y error con GetStdHandle en el constructor. Intentar restaurarlos con SetConsoleActiveScreenBuffer. cout sigue sin escribir en consola.
2º Cerrar el handle de salida con CloseHandle, volver a abrirlos con GetStdHandle y usar cout. Aqui GetLastError dice que no hay error, pero no se escribe nada en consola
3º Abrir los flujos de consola CONIN$,CONOUT$,CONERR$ con CreateFile. Restaurarlos con SetConsoleActiveScreenBuffer y usar cout. GetLastError dice INVALID_HANDLE y no se escribe nada en consola
Pueden decirme qué es lo que hago mal ?
PD: uso W Xp SP3 y VC++ 2008
Gracias
console.h
// console.h
#ifndef __CONSOLE_H__
#define __CONSOLE_H__
#include <iostream>
#include <fstream>
using std::cout;
using std::cin;
using std::cerr;
using std::streambuf;
using std::ofstream;
using std::ifstream;
class console
{
private:
ofstream n_cout;
ofstream n_cerr; // new streams
ifstream n_cin;
streambuf* old_cout;
streambuf* old_cerr; // old streams
streambuf* old_cin;
public:
console();
~console();
void hide();
void show(); // not implemented yet
};
#endif
console.cpp
#include "console2.h"
#include <windows.h>
console::console()
{
// create a console window
AllocConsole();
// redirect cout to console window
this->old_cout = cout.rdbuf();
this->n_cout.open("CONOUT$");
cout.rdbuf( this->n_cout.rdbuf() );
// redirect cerr
this->old_cerr = cerr.rdbuf();
this->n_cerr.open("CONOUT$");
cerr.rdbuf( this->n_cerr.rdbuf() );
// redirect cin
this->old_cin = cin.rdbuf();
this->n_cin.open("CONIN$");
cin.rdbuf( this->n_cin.rdbuf() );
}
console::~console()
{
// restore streams
cin.rdbuf( this->n_cin.rdbuf() );
cerr.rdbuf( this->n_cerr.rdbuf() );
cout.rdbuf( this->n_cout.rdbuf() );
// free console resources
FreeConsole();
}
// main.cpp
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
// all WNDCLASSEX, RegisterClassEx,CreateWindow, etc stuff
console c;
int number = 0;
cout << "n cout works";
cerr << "n cerr works";
cin >> number; // cin works
DWORD error = GetLastError(); // INVALID_HANDLE_VALUE ¿ por qué ?
cout << "n The number is: " << number; // Esto ya no funciona
cerr << number; // ahora escribe todo lo que haya en el buffer
}