2011-02-23 8 views
8

Los programas MFC normalmente no pueden escribir en stdout. MFC hace algo raro con las tuberías stdout/stdin durante el inicio y todo lo que escribe (por ejemplo, hacer una impresión ("hola");) simplemente va a/dev/null.¿cómo escribo en stdout desde un programa MFC?

¿Alguien sabe cómo escribir correctamente en stdout desde un programa MFC?

Gracias por leer.

Respuesta

7

Utilice la función AllocConsole para crear una consola para escribir. El siguiente artículo explica cómo usarlo para imprimir en la consola.

Creating a console for your MFC app's debug output

No se olvide de FreeConsole una vez que haya terminado con él.

+0

Esto es casi lo que yo quiero, sino que está creando un nuevo consola. Estaba usando AttachToConsole (ATTACH_PARENT_PROCESS) y no obtuve nada. Pero la solución es _cprintf() que me has dado. Por lo tanto, obtienes los puntos. ¡Gracias! –

+0

@Stephen: Probablemente también quiera ver la función [AttachConsole] (http://msdn.microsoft.com/en-us/library/ms681952 (v = vs.85) .aspx). Es un poco diferente de lo que estabas experimentando. – Nawaz

+0

[¿Cómo escribo una buena respuesta?] (Http://stackoverflow.com/help/how-to-answer). – IInspectable

7

Aquí hay un trazador de líneas que encontré en línea hace un tiempo que conecta stdout a una consola en MFC. Esto permite que printf y cout escriban en la ventana de la consola del proceso actual. Nunca investigué cómo funciona, así que si necesitas una versión de cerr o cin estás solo.

AllocConsole(); 
*stdout = *_tfdopen(_open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), _O_APPEND), _T("a")); 
+0

Gracias, esto funcionó para mí. Necesitaba incluir . – opetroch

7

Esto se adjuntará a la ventana de la consola de llamada, si existe. GotConsoleAttach será FALSE cuando la aplicación no fue llamada desde una consola.

GotConsoleAttach = FALSE;  
if (AttachConsole(ATTACH_PARENT_PROCESS)) 
{ 
    int osfh = _open_osfhandle((intptr_t) GetStdHandle(STD_OUTPUT_HANDLE), 8); 
    if ((HANDLE)osfh != INVALID_HANDLE_VALUE) 
    { 
     *stdout = *_tfdopen(osfh, _T("a")); 
     GotConsoleAttach = TRUE; 
    } 
} 
+0

Esto funcionó muy bien para mí. En una nota lateral, ya que esta es una aplicación de Windows, he usado 'START/WAIT myapp.exe' para que funcione correctamente. – mateuscb

7

Si solo está buscando la salida a la ventana de depuración, puede usar TRACE.

TRACE("This is a debug string of text in MFC"); 

Lo hago cuando estoy probando rápidamente algo y no quiero utilizar cuadros de diálogo, como MessageBox ("texto").

+0

Esto no responde la pregunta que hice. –

0

Después de pasar un día entero tratando de hacer mi programa MFC para imprimir usando printf() y cout, finalmente he encontrado una solución y decidir a publicar aquí para ayudar a que quiere imprimir en MFC ...

void EnablePrintfAtMFC() 
{ 
    if (AttachConsole(ATTACH_PARENT_PROCESS)) 
    { 
     FILE* pCout; 
     freopen_s(&pCout, "CONOUT$", "w", stdout); 
     std::cout.clear(); 
     std::wcout.clear(); 
    } 
} 

Sólo tiene que llamar la función anterior en algún lugar de su programa, y ​​después de que usted será capaz de utilizar printf() y cout ...

EnablePrintfAtMFC(); 
printf("Hello world!\n"); 
std::cout << "It works!" << endl; 
Cuestiones relacionadas