Programación General > C/C++

 INVALID_HANDLE redireccionando cin,cout,cerr

(1/1)

krnl64:
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

--- Código: C++ --- // 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

--- Código: C++ --- #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

--- Código: C++ ---  #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}  

Navegación

[0] Índice de Mensajes

Ir a la versión completa