Wie können Sie die printf-Ausgabe in a anzeigen Win32 Anwendung (Eingabe mit einem WinMain) in Visual Studio 2010?
Wie kann man die printf-Ausgabe in einer Win32-Anwendung in Visual Studio 2010 anzeigen?
Nick van Brunt
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 aufgerufenWinMain
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
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_TEXT
du 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
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");
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
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
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);
}
}
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