Comment puis-je imprimer dans la fenêtre de sortie de débogage dans une application Win32?

J’ai un projet win32 que j’ai chargé dans Visual Studio 2005. Je voudrais pouvoir imprimer des choses dans la fenêtre de sortie de Visual Studio, mais je ne peux pas du tout savoir comment. J’ai essayé ‘printf’ et ‘cout <<' mais mes messages ne sont pas imprimés.

Existe-t-il un moyen spécial d’imprimer dans la fenêtre de sortie de Visual Studio?

Vous pouvez utiliser OutputDebugSsortingng . OutputDebugSsortingng est une macro qui, en fonction de vos options de génération, mappe vers OutputDebugSsortingngA(char const*) ou OutputDebugSsortingngW(wchar_t const*) . Dans le dernier cas, vous devrez fournir une chaîne de caractères étendue à la fonction. Pour créer un littéral de caractère large, vous pouvez utiliser le préfixe L :

 OutputDebugSsortingngW(L"My output ssortingng."); 

Normalement, vous utiliserez la version de macro avec la macro _T comme ceci:

 OutputDebugSsortingng(_T("My output ssortingng.")); 

Si vous projetez est configuré pour générer pour UNICODE, il développera dans:

 OutputDebugSsortingngW(L"My output ssortingng."); 

Si vous ne construisez pas pour UNICODE, il développera dans:

 OutputDebugSsortingngA("My output ssortingng."); 

Si le projet est un projet d’interface graphique, aucune console n’apparaîtra. Pour changer le projet en console, vous devez accéder au panneau des propriétés du projet et définir:

  • Dans ” linker-> System-> SubSystem ” la valeur ” Console (/ SUBSYSTEM: CONSOLE)
  • Dans ” C / C ++ -> Préprocesseur-> Définitions de préprocesseur “, ajoutez le paramètre_CONSOLE

Cette solution ne fonctionne que si vous aviez le point d’entrée classique ” int main () “.

Mais si vous êtes comme dans mon cas (un projet openGL), vous n’avez pas besoin d’éditer les propriétés, car cela fonctionne mieux:

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

printf et cout vont travailler comme d’habitude.

Si vous appelez AllocConsole avant la création d’une fenêtre, la console apparaîtra derrière la fenêtre, si vous l’appelez après, elle apparaîtra devant.

Pour imprimer sur la console real , vous devez la rendre visible à l’aide de l’indicateur de l’éditeur de liens /SUBSYSTEM:CONSOLE . La fenêtre de la console supplémentaire est agaçante, mais à des fins de débogage, elle est très utile.

OutputDebugSsortingng s’imprime sur la sortie du débogueur lors de l’exécution dans le débogueur.

Envisagez d’utiliser les macros d’exécution VC ++ pour Reporting _RPT N () et _RPTF N ()

Vous pouvez utiliser les macros _RPTn et _RPTFn, définies dans CRTDBG.H, pour remplacer l’utilisation des instructions printf pour le débogage. Ces macros disparaissent automatiquement dans votre version de publication lorsque _DEBUG n’est pas défini. Il n’est donc pas nécessaire de les inclure dans #ifdefs.

Exemple…

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

Ou vous pouvez utiliser directement les fonctions d’exécution VC ++ _CrtDbgReport, _CrtDbgReportW .

_CrtDbgReport et _CrtDbgReportW peuvent envoyer le rapport de débogage à trois destinations différentes: un fichier de rapport de débogage, un moniteur de débogage (le débogueur Visual Studio) ou une fenêtre de message de débogage.

_CrtDbgReport et _CrtDbgReportW créent le message utilisateur pour le rapport de débogage en substituant les arguments d’argument [n] à la chaîne de format, en utilisant les mêmes règles que celles définies par les fonctions printf ou wprintf. Ces fonctions génèrent ensuite le rapport de débogage et déterminent la ou les destinations, en fonction des modes de rapport et du fichier définis pour reportType. Lorsque le rapport est envoyé à une fenêtre de message de débogage, le nom de fichier, lineNumber et moduleName sont inclus dans les informations affichées dans la fenêtre.

Votre projet Win32 est probablement un projet d’interface graphique, pas un projet de console. Cela provoque une différence dans l’en-tête de l’exécutable. Par conséquent, votre projet d’interface graphique sera responsable de l’ouverture de sa propre fenêtre. Cela peut être une fenêtre de console, cependant. Appelez AllocConsole() pour le créer et utilisez les fonctions de la console Win32 pour y écrire.

Si vous souhaitez imprimer des variables décimales:

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

Si vous avez besoin de voir la sortie d’un programme existant qui a largement utilisé printf sans modifier le code (ou avec des modifications minimes), vous pouvez redéfinir printf comme suit et l’append à l’en-tête commun (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); OutputDebugSsortingngA(s_printf_buf); return 0; } #define printf(format, ...) \ print_log(format, __VA_ARGS__) 

Je cherchais un moyen de le faire moi-même et j’ai trouvé une solution simple.

Je suppose que vous avez démarré un projet Win32 par défaut (application Windows) dans Visual Studio, qui fournit une fonction “WinMain”. Par défaut, Visual Studio définit le point d’entrée sur «SUBSYSTEM: WINDOWS». Vous devez d’abord changer cela en allant sur:

Projet -> Propriétés -> Linker -> Système -> Sous-système

Et sélectionnez “Console (/ SUBSYSTEM: CONSOLE)” dans la liste déroulante.

Maintenant, le programme ne fonctionnera pas, car une fonction “principale” est nécessaire à la place de la fonction “WinMain”.

Donc maintenant vous pouvez append une fonction “principale” comme vous le feriez normalement en C ++. Après cela, pour lancer le programme graphique, vous pouvez appeler la fonction “WinMain” depuis la fonction “main”.

La partie de départ de votre programme devrait maintenant ressembler à ceci:

 #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; . . . 

Résultat de ma mise en œuvre

Maintenant, vous pouvez utiliser des fonctions pour afficher sur la console dans n'importe quelle partie de votre programme graphique pour le débogage ou à d'autres fins.

Vous pouvez également utiliser la méthode WriteConsole pour imprimer sur la console.

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