¿Cómo imprimo en la ventana de salida de depuración en una aplicación Win32?

Tengo un proyecto de win32 que cargué en Visual Studio 2005. Me gustaría poder imprimir cosas en la ventana de salida de Visual Studio, pero no puedo averiguar cómo. He intentado con ‘printf’ y ‘cout <<', pero mis mensajes siguen siendo obstinadamente no impresos.

¿Hay algún tipo de forma especial de imprimir en la ventana de salida de Visual Studio?

Puede usar OutputDebugString . OutputDebugString es una macro que, dependiendo de tus opciones de comstackción, asigna a OutputDebugStringA(char const*) o OutputDebugStringW(wchar_t const*) . En el caso posterior, deberá proporcionar una cadena de caracteres amplia a la función. Para crear un literal de caracteres anchos, puede usar el prefijo L :

 OutputDebugStringW(L"My output string."); 

Normalmente usará la versión de macro junto con la macro _T esta manera:

 OutputDebugString(_T("My output string.")); 

Si el proyecto está configurado para comstackr para UNICODE, se expandirá a:

 OutputDebugStringW(L"My output string."); 

Si no está comstackndo para UNICODE, se expandirá a:

 OutputDebugStringA("My output string."); 

Si el proyecto es un proyecto de GUI, no aparecerá ninguna consola. Para cambiar el proyecto a consola, debe ir al panel de propiedades del proyecto y configurarlo:

  • En ” linker-> System-> SubSystem ” el valor ” Console (/ SUBSYSTEM: CONSOLE)
  • En ” C / C ++ -> Preprocesador-> Definiciones de preprocesador “, agregue el ” _CONSOLE ” defina

Esta solución solo funciona si tiene el clásico punto de entrada ” int main () “.

Pero si usted es como en mi caso (un proyecto de OpenGL), no necesita editar las propiedades, ya que esto funciona mejor:

 AllocConsole(); freopen("CONIN$", "r",stdin); freopen("CONOUT$", "w",stdout); freopen("CONOUT$", "w",stderr); 

printf y cout funcionarán como de costumbre.

Si llama a AllocConsole antes de la creación de una ventana, la consola aparecerá detrás de la ventana, si la llama después, aparecerá más adelante.

Para imprimir en la consola real , debe hacerla visible utilizando la bandera del enlazador /SUBSYSTEM:CONSOLE . La ventana extra de la consola es molesta, pero para fines de depuración es muy valiosa.

OutputDebugString imprime en la salida del depurador cuando se ejecuta dentro del depurador.

Considere usar las macros de tiempo de ejecución de VC ++ para generar informes _RPT N () y _RPTF N ()

Puede usar las macros _RPTn y _RPTFn, definidas en CRTDBG.H, para reemplazar el uso de instrucciones printf para la depuración. Estas macros desaparecen automáticamente en su comstackción de lanzamiento cuando _DEBUG no está definido, por lo que no es necesario que las incluya en #ifdefs.

Ejemplo…

 if (someVar > MAX_SOMEVAR) { _RPTF2(_CRT_WARN, "In NameOfThisFunc( )," " someVar= %d, otherVar= %d\n", someVar, otherVar ); } 

O puede usar las funciones de tiempo de ejecución de VC ++ _CrtDbgReport, _CrtDbgReportW directamente.

_CrtDbgReport y _CrtDbgReportW pueden enviar el informe de depuración a tres destinos diferentes: un archivo de informe de depuración, un depurador (el depurador de Visual Studio) o una ventana de mensaje de depuración.

_CrtDbgReport y _CrtDbgReportW crean el mensaje de usuario para el informe de depuración sustituyendo los argumentos del argumento [n] en la cadena de formato, utilizando las mismas reglas definidas por las funciones printf o wprintf. Estas funciones luego generan el informe de depuración y determinan el destino o los destinos, en función de los modos de informe actuales y el archivo definido para reportType. Cuando el informe se envía a una ventana de mensaje de depuración, el nombre del archivo, el número de línea y el nombre del módulo se incluyen en la información que se muestra en la ventana.

Su proyecto Win32 probablemente sea un proyecto GUI, no un proyecto de consola. Esto causa una diferencia en el encabezado ejecutable. Como resultado, su proyecto de GUI será responsable de abrir su propia ventana. Sin embargo, puede ser una ventana de consola. Llame a AllocConsole() para crearlo y use las funciones de la consola Win32 para escribir en él.

Si desea imprimir variables decimales:

 wchar_t text_buffer[20] = { 0 }; //temporary buffer swprintf(text_buffer, _countof(text_buffer), L"%d", your.variable); // convert OutputDebugString(text_buffer); // print 

Si necesita ver el resultado de un progtwig existente que usaba printf sin cambiar el código (o con cambios mínimos), puede redefinir printf de la siguiente manera y agregarlo al encabezado común (stdafx.h).

 int print_log(const char* format, ...) { static char s_printf_buf[1024]; va_list args; va_start(args, format); _vsnprintf(s_printf_buf, sizeof(s_printf_buf), format, args); va_end(args); OutputDebugStringA(s_printf_buf); return 0; } #define printf(format, ...) \ print_log(format, __VA_ARGS__) 

Estaba buscando una forma de hacerlo yo mismo y descubrí una solución simple.

Supongo que comenzó un Proyecto Win32 predeterminado (aplicación Windows) en Visual Studio, que proporciona una función “WinMain”. De forma predeterminada, Visual Studio establece el punto de entrada en “SUBSISTEMA: WINDOWS”. Primero debe cambiar esto yendo a:

Proyecto -> Propiedades -> Enlazador -> Sistema -> Subsistema

Y seleccione “Consola (/ SUBSISTEMA: CONSOLA)” en la lista desplegable.

Ahora, el progtwig no se ejecutará, ya que se necesita una función “principal” en lugar de la función “WinMain”.

Entonces ahora puede agregar una función “principal” como lo haría normalmente en C ++. Después de esto, para iniciar el progtwig GUI, puede llamar a la función “WinMain” desde dentro de la función “principal”.

La parte inicial de su progtwig debería verse ahora de la siguiente manera:

 #include  using namespace std; // Main function for the console int main(){ // Calling the wWinMain function to start the GUI program // Parameters: // GetModuleHandle(NULL) - To get a handle to the current instance // NULL - Previous instance is not needed // NULL - Command line parameters are not needed // 1 - To show the window normally wWinMain(GetModuleHandle(NULL), NULL,NULL, 1); system("pause"); return 0; } // Function for entry into GUI program int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // This will display "Hello World" in the console as soon as the GUI begins. cout << "Hello World" << endl; . . . 

Resultado de mi implementación

Ahora puede usar las funciones para enviarlas a la consola en cualquier parte de su progtwig GUI para la depuración u otros fines.

También puede usar el método WriteConsole para imprimir en la consola.

 AllocConsole(); LPSTR lpBuff = "Hello Win32 API"; DWORD dwSize = 0; WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), lpBuff, lstrlen(lpBuff), &dwSize, NULL);