2010-06-09 9 views
15

Comment afficher la sortie printf dans une application Win32 (saisie avec un WinMain) dans Visual Studio 2010?Comment afficher la sortie printf dans une application Win32 sur Visual Studio 2010?

+0

Voulez-vous ouvrir une fenêtre de console séparée de l'application, ou voulez-vous pour l'afficher dans un contrôle sur la fenêtre principale de l'application? Ou connectez-vous à un fichier? –

+1

En fait j'espérais quelque chose comme la fenêtre de la console dans xcode où vous pouvez voir la sortie de la console sans avoir à changer de code. Un journal montrant stdout ferait aussi bien. –

Répondre

23

vous peut strictement répondre à votre question, utilisez les fonctions printf comme 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 en tant que paramètre. J'ai utilisé le sprintf_s pour formater la chaîne avant l'impression.

Cela afficherait le résultat dans la fenêtre de sortie de Visual   Studio   2010.

J'espère que ça aide!

+0

Évidemment le 256 n'est là que par exemple mais j'aime bien cette approche. Certainement ce que j'avais en tête. –

+0

Bien sûr, juste un exemple. Vous pouvez l'envelopper dans une classe/fonction pour plus de commodité. Heureux que ça a aidé! À votre santé! – rbento

+0

'wchar_t str [256]; wsprintf (str, L "Cela fonctionne! - nombre:% d \ n", nombre); OutputDebugString (str); ' –

12

Je sais que je l'ai fait dans le passé en utilisant la fonction AllocConsole, mais je me souviens aussi que c'était juste un peu plus compliqué que prévu.

Une recherche rapide de Google sur AllocConsole donne ce qui semble être un Windows Developer Journal article qui semble pertinent. De là, ce qui suit ressemble à ce dont 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); 
} 
+0

Pour une raison quelconque cela ne fonctionne pas avec la sortie colorée – paulm

11

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, Lieur, Système, Sous-Système = Console. Ajouter une méthode principale():

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

'_tWinMain' est la fonction principale à la place appelée' WinMain' pour une application Win32 –

9

Merci torak pour votre réponse. Cela m'a beaucoup aidé.

je besoin d'un plus grand rouleau arrière tampon ainsi fait quelques ajouts après avoir pris un coup d'œil à la API functions. Partagée ici dans le cas où il aide 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 le défilement arrière hauteur (mémoire tampon d'écran) 9999 lignes.

Testé sous Windows XP et Windows 7.

+2

Pour enregistrer les recherches de coupe-et-pasters comme moi, il faut également inclure et pour la fonction et les drapeaux de définitions –

6

Une autre façon qui ne serait pas nécessaire de changer de existant printf et imprimer aussi à la fenêtre de sortie VS irait quelque chose comme ceci:

#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"); 
+1

vous êtes un génie! – Skynight

Questions connexes