¿Cómo ver la salida de printf en una aplicación Win32 en Visual Studio 2010?

4 minutos de lectura

avatar de usuario
Nick Van Brunt

¿Cómo puede ver la salida de printf en un Win32 aplicación (entrando con un WinMain) en estudio visual 2010?

  • ¿Desea abrir una ventana de consola separada de la aplicación o desea mostrarla en un control en la ventana principal de la aplicación? ¿O registrarlo en un archivo?

    – Mark Ransom

    9 de junio de 2010 a las 19:45

  • En realidad, esperaba algo como la ventana de la consola en xcode donde puede ver la salida de la consola sin tener que cambiar ningún código. Un registro que muestre stdout también funcionaría bien.

    –Nick Van Brunt

    9 de junio de 2010 a las 20:05

Necesitará una ventana de consola. Con mucho, la forma más fácil de obtener uno es cambiar una opción del enlazador: Proyecto + Propiedades, Enlazador, Sistema, Subsistema = Consola. Agrega un método main():

int main() {
    return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}

  • _tWinMain es la función principal llamada en su lugar WinMain para una aplicación Win32

    – Riaz Rizvi

    28 de enero de 2014 a las 3:57


  • En mi caso wWinMain. De todos modos, muchas gracias por esta respuesta. Me estaba volviendo loco con todas las otras respuestas que pude encontrar en Internet. Una consola separada de la interfaz de usuario era lo mejor posible.

    – Canis lupus

    17/03/2021 a las 20:05

  • Obviamente, el 256 solo está ahí como ejemplo, pero me gusta este enfoque. Definitivamente lo que tenía en mente.

    –Nick Van Brunt

    30 de junio de 2011 a las 18:19

  • Claro, solo un ejemplo. Puede envolverlo en una clase/función por conveniencia. ¡Me alegro de que haya ayudado! ¡Salud!

    – rbento

    5 de julio de 2011 a las 21:34


  • wchar_t str[256]; wsprintf(str, L"It works! - number: %d \n", number); OutputDebugString(str);

    – Steve Lanzadores

    7 julio 2016 a las 20:23


  • Esto funciona, pero agregar un búfer temporal es tedioso. Me gusta la respuesta de Han de mostrar la consola además de la interfaz de usuario, entonces puedo usar printf.

    – Mateo

    14/04/2021 a las 13:45

avatar de usuario
torak

Sé que he hecho esto en el pasado usando el AllocConsole función, pero también recuerdo que fue un poco más complicado de lo que esperaba.

Una búsqueda rápida en Google en AllocConsole produce lo que aparentemente es un Artículo del diario para desarrolladores de Windows eso parece relevante. A partir de ahí, lo siguiente parece similar a lo que recuerdo, por vago que sea.

void SetStdOutToNewConsole()
{
    int hConHandle;
    long lStdHandle;
    FILE *fp;

    // Allocate a console for this app
    AllocConsole();

    // Redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;

    setvbuf(stdout, NULL, _IONBF, 0);
}

  • Por alguna razón, esto no funciona con la salida en color.

    – Paula

    1 de enero de 2016 a las 14:06

  • Usar _open_osfhandle()necesitas #include <io.h>y para usar _O_TEXTnecesitas #include <fcntl.h>.

    – M Katz

    9 de julio de 2018 a las 6:41


  • ¿Funciona esto para las personas en Windows 10 actual? Porque no es para mí. Definitivamente trabajando en el pasado.

    – preocuparse

    23 de agosto de 2018 a las 7:28

Gracias torak Para tu respuesta. Me ayudó mucho.

Necesitaba un búfer de desplazamiento hacia atrás más grande, así que hice algunas adiciones después de echar un vistazo a la Funciones API. Compartido aquí en caso de que ayude a alguien más:

void SetStdOutToNewConsole()
{
    // allocate a console for this app
    AllocConsole();

    // redirect unbuffered STDOUT to the console
    HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    int fileDescriptor = _open_osfhandle((intptr_t)consoleHandle, _O_TEXT);
    FILE *fp = _fdopen( fileDescriptor, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // give the console window a nicer title
    SetConsoleTitle(L"Debug Output");

    // give the console window a bigger buffer size
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if ( GetConsoleScreenBufferInfo(consoleHandle, &csbi) )
    {
        COORD bufferSize;
        bufferSize.X = csbi.dwSize.X;
        bufferSize.Y = 9999;
        SetConsoleScreenBufferSize(consoleHandle, bufferSize);
    }
}

Esto aumenta la altura de desplazamiento hacia atrás (búfer de pantalla) a 9999 líneas.

Probado en Windows XP y Windows 7.

  • Por alguna razón, esto no funciona con la salida en color.

    – Paula

    1 de enero de 2016 a las 14:06

  • Usar _open_osfhandle()necesitas #include <io.h>y para usar _O_TEXTnecesitas #include <fcntl.h>.

    – M Katz

    9 de julio de 2018 a las 6:41


  • ¿Funciona esto para las personas en Windows 10 actual? Porque no es para mí. Definitivamente trabajando en el pasado.

    – preocuparse

    23 de agosto de 2018 a las 7:28

avatar de usuario
grano de café

Aquí hay una página que le dirá cómo hacer esto, incluido un código de muestra.

Debe crear una ventana de consola usando AllocConsole(), luego asociar los identificadores de archivo estándar de C a los identificadores de la nueva ventana de consola.

  • 3 líneas de código que me lo resolvieron con AllocConsole(): stackoverflow.com/a/55459226/197979

    – Dmitri

    10 de enero de 2020 a las 19:46

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad