c++ - ¿Cómo imprimo en la ventana de salida de depuración en una aplicación Win32?
visual-studio winapi (9)
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?
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 compilació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.
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 programa 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 programa GUI, puede llamar a la función "WinMain" desde dentro de la función "principal".
La parte inicial de su programa debería verse ahora de la siguiente manera:
#include <iostream>
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 programa GUI para la depuración u otros fines.
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.
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 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.
Si necesita ver el resultado de un programa 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__)
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.
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);
Puede usar OutputDebugString
. OutputDebugString
es una macro que, dependiendo de tus opciones de compilació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 compilar para UNICODE, se expandirá a:
OutputDebugStringW(L"My output string.");
Si no está compilando para UNICODE, se expandirá a:
OutputDebugStringA("My output string.");