Tengo acceso a una biblioteca de terceros que hace "cosas buenas". Emite mensajes de estado y progreso a stdout. En una aplicación de consola puedo ver estos mensajes muy bien. En una aplicación de Windows simplemente van al cubo de bits.¿Cómo puedo redireccionar stdout a alguna pantalla visible en una aplicación de Windows?
Hay una manera bastante simple de redirigir stdout y stderr a un control de texto u otro lugar visible. Idealmente, esto no requeriría ninguna recompilación del código de terceros. Simplemente interceptaría los vapores a un nivel bajo. Me gustaría una solución donde acabo #Include la cabecera, llame a la función de inicialización y vincular la biblioteca como en ...
#include "redirectStdFiles.h"
void function(args...)
{
TextControl* text = new TextControl(args...);
initializeRedirectLibrary(text, ...);
printf("Message that will show up in the TextControl\n");
std::cout << "Another message that also shows up in TextControl\n";
}
Aún mejor sería si se utiliza alguna de las interfaces que podría anular por lo que es no vinculado a ninguna biblioteca de GUI en particular.
class StdFilesRedirector
{
public:
writeStdout(std::string const& message) = 0;
writeStderr(std::string const& errorMessage) = 0;
readStdin(std::string &putReadStringHere) = 0;
};
¿Estoy soñando? ¿O alguien sabe de algo que puede hacer algo como esto?
Editar después de dos respuestas: Creo que usar freopen para redirigir los archivos es un buen primer paso. Para una solución completa, debería haber un nuevo hilo creado para leer el archivo y mostrar el resultado. Para la depuración, hacer un 'tail -f' en una ventana de cgwin shell sería suficiente. Para una aplicación más pulida ... Que es lo que quiero escribir ... habría un trabajo extra para crear el hilo, etc.
'AllocConsole' es la pieza que falta. Produce la ventana de consola familiar. Las funciones de lectura y escritura son incómodas, pero puede redirigir stdout/stdin a/desde él fácilmente usando este método: https://stackoverflow.com/a/15547699/133836 –