Comment pouvez-vous afficher la sortie printf dans une application Win32 (entrée avec un WinMain) dans Visual Studio 201 ?
Répondant strictement à votre question, vous pouvez utiliser des fonctions de type printf dans une application Win32 dans Visual Studio 2010 en utilisant la fonction winbase.hOutputDebugString
.
J'ai écrit un programme simple qui montre comment le faire.
#include <windows.h>
#include <stdio.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdShow, int nCmdShow)
{
int number = 10;
char str[256];
sprintf_s(str, "It works! - number: %d \n", number);
OutputDebugString(str);
return 0;
}
La fonction OutputDebugString
prend un LPCSTR
comme paramètre. J'ai utilisé le sprintf_s
pour formater la chaîne avant l'impression.
Cela imprimerait le résultat dans la fenêtre de sortie de Visual Studio 2010.
J'espère que ça aide!
Vous aurez besoin d'une fenêtre de console. De loin, le moyen le plus simple d'en obtenir un est de modifier une option de l'éditeur de liens: Projet + Propriétés, Éditeur de liens, Système, Sous-système = Console. Ajoutez une méthode main ():
int main() {
return _tWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
}
Je sais que je l'ai fait dans le passé en utilisant la fonction AllocConsole , mais je me souviens également que c'était juste un peu plus compliqué que ce à quoi je m'attendais.
Une recherche rapide sur Google sur AllocConsole donne ce qui est apparemment un article du Windows Developer Journal qui semble pertinent. De là, ce qui suit ressemble à ce que je me souviens, aussi vague soit-il.
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);
}
Merci torak pour votre réponse. Cela m'a beaucoup aidé.
J'avais besoin d'un plus grand tampon de défilement arrière, j'ai donc fait quelques ajouts après avoir jeté un coup d'œil aux fonctions API . Partagé ici au cas où cela aiderait quelqu'un d'autre:
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);
}
}
Cela augmente la hauteur de défilement arrière (tampon d'écran) à 9 999 lignes.
Testé sous Windows XP et Windows 7.
Une autre façon qui ne nécessiterait pas de modifier les printf existants et également d'imprimer dans la fenêtre de sortie VS serait la suivante:
#define printf printf2
int __cdecl printf2(const char *format, ...)
{
char str[1024];
va_list argptr;
va_start(argptr, format);
int ret = vsnprintf(str, sizeof(str), format, argptr);
va_end(argptr);
OutputDebugStringA(str);
return ret;
}
...
printf("remains %s", "the same");
Voici une page qui vous expliquera comment procéder, y compris un exemple de code.
Vous devez créer une fenêtre de console à l'aide d'AllocConsole (), puis associer les descripteurs de fichier standard C aux POIGNÉES de la nouvelle fenêtre de console.
Pour MinGW, utilisez "_A_SYSTEM" à la place de "_O_TEXT". Donc porté Quintin Willison la réponse est la suivante:
#include <io.h>
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, _A_SYSTEM);
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);
}
}