Wie kann man die printf-Ausgabe in einer Win32-Anwendung in Visual Studio 2010 anzeigen?

Lesezeit: 5 Minuten

Benutzer-Avatar
Nick van Brunt

Wie können Sie die printf-Ausgabe in a anzeigen Win32 Anwendung (Eingabe mit einem WinMain) in Visual Studio 2010?

  • Möchten Sie ein separates Konsolenfenster der App öffnen oder es in einem Steuerelement im Hauptfenster der App anzeigen? Oder in einer Datei protokollieren?

    – Markieren Sie Lösegeld

    9. Juni 2010 um 19:45 Uhr

  • Eigentlich hatte ich auf so etwas wie das Konsolenfenster in xcode gehofft, in dem Sie die Konsolenausgabe sehen können, ohne Code ändern zu müssen. Ein Protokoll, das stdout anzeigt, würde auch gut funktionieren.

    – Nick van Brunt

    9. Juni 2010 um 20:05 Uhr

Benutzer-Avatar
rbento

Bearbeiten 2021, Visual Studio 2019

Um Debug-Meldungen in das Ausgabefenster zu schreiben, verwenden Sie die AusgabeDebugStringA aus debugapi.h (einschließlich windows.h)

test.c

#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, sizeof(str), "It works! - number: %d \n", number);

    OutputDebugStringA(str);

    return 0;
}

Getestet auf Visual Studio 2019, Debug / x64.

Oder nutzen Sie alternativ mein Drop-In Header Datei.

  • Offensichtlich ist der 256 nur zum Beispiel da, aber ich mag diesen Ansatz. Definitiv das, was ich im Sinn hatte.

    – Nick van Brunt

    30. Juni 2011 um 18:19 Uhr

  • Klar, nur ein Beispiel. Sie können es der Einfachheit halber in eine Klasse/Funktion einschließen. Schön, dass es geholfen hat! Prost!

    – rbento

    5. Juli 2011 um 21:34 Uhr


  • wchar_t str[256]; wsprintf(str, L"It works! - number: %d \n", number); OutputDebugString(str);

    – Steve Krüger

    7. Juli 2016 um 20:23 Uhr


  • Das funktioniert, aber das Hinzufügen eines temporären Puffers ist mühsam. Ich mag Hans Antwort, die Konsole zusätzlich zur Benutzeroberfläche anzuzeigen, dann kann ich sie einfach verwenden printf.

    – Matthew

    14. April 2021 um 13:45 Uhr

Sie benötigen ein Konsolenfenster. Der bei weitem einfachste Weg, eine zu erhalten, besteht darin, eine Linker-Option zu ändern: Projekt + Eigenschaften, Linker, System, Subsystem = Konsole. Fügen Sie eine main() Methode hinzu:

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

  • _tWinMain wird stattdessen die Hauptfunktion aufgerufen WinMain für eine Win32-Anwendung

    – Riaz Rizvi

    28. Januar 2014 um 3:57 Uhr


  • In meinem Fall wWinMain. Auf jeden Fall vielen Dank für diese Antwort. Ich war verrückt nach all den anderen Antworten, die ich im Internet finden konnte. Eine von der Benutzeroberfläche getrennte Konsole war das Beste, was möglich war.

    – Wolf

    17. März 2021 um 20:05 Uhr

Benutzer-Avatar
Torak

Ich weiß, dass ich dies in der Vergangenheit mit dem getan habe AllocConsole funktionieren, aber ich erinnere mich auch, dass es nur ein wenig kniffliger war, als ich erwartet hatte.

Eine schnelle Google-Suche auf AllocConsole ergibt, was anscheinend a ist Artikel im Windows Developer Journal das scheint relevant. Von dort aus scheint das Folgende dem zu ähneln, woran ich mich erinnere, so vage es auch ist.

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);
}

  • Aus irgendeinem Grund funktioniert dies nicht mit farbiger Ausgabe

    – paulm

    1. Januar 2016 um 14:06 Uhr

  • Benutzen _open_osfhandle()du musst #include <io.h>und zu verwenden _O_TEXTdu musst #include <fcntl.h>.

    – M Katz

    9. Juli 2018 um 6:41 Uhr


  • Funktioniert das für Leute mit aktuellem Windows 10? Weil es nichts für mich ist. Hat in der Vergangenheit definitiv funktioniert.

    – ärgern

    23. August 2018 um 7:28 Uhr

Benutzer-Avatar
Colin Lamarre

Ein anderer Weg, der keine Änderung bestehender printfs erfordern und auch in das VS-Ausgabefenster drucken würde, würde ungefähr so ​​​​aussehen:

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

Benutzer-Avatar
Quintin Willison

Vielen Dank Torak für deine Antwort. Es hat mir sehr geholfen.

Ich brauchte einen größeren Scroll-Back-Puffer, also machte ich ein paar Ergänzungen, nachdem ich einen Blick auf die geworfen hatte API-Funktionen. Hier geteilt, falls es jemand anderem hilft:

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);
    }
}

Dadurch wird die Höhe des Zurückblätterns (Bildschirmpuffers) auf 9999 Zeilen erhöht.

Getestet auf Windows XP und Windows 7.

  • Um Lookups für Cut-and-Paster wie mich zu sparen, muss man auch und für die Funktions- und Flag-Definitionen einschließen

    – Plasma

    27. Februar 2017 um 4:54 Uhr


Benutzer-Avatar
Kaffeebohne

Auf dieser Seite erfahren Sie, wie Sie dies tun, einschließlich Beispielcode.

Sie müssen ein Konsolenfenster mit AllocConsole() erstellen und dann die C-Standarddateihandles den HANDLEs des neuen Konsolenfensters zuordnen.

  • Um Lookups für Cut-and-Paster wie mich zu sparen, muss man auch und für die Funktions- und Flag-Definitionen einschließen

    – Plasma

    27. Februar 2017 um 4:54 Uhr


Benutzer-Avatar
Benutzer

Verwenden Sie für MinGW “_A_SYSTEM” anstelle von “_O_TEXT”. Also portiert Quintin Willison Antwort ist wie folgt:

#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);
  }
}

1369950cookie-checkWie kann man die printf-Ausgabe in einer Win32-Anwendung in Visual Studio 2010 anzeigen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy