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
Ir a la versión completa