2010-06-09 19 views
15

Visual Studio 2010Win32 uygulamasında (bir WinMain ile girerek) printf çıktısını nasıl görüntüleyebilirsiniz?Visual Studio 2010'da bir Win32 uygulamasında printf çıktısı nasıl görüntülenir?

+0

Uygulamayı kullanarak bir ayrı konsol penceresini açmak istiyor veya istediğiniz yapıyor musunuz ana uygulama penceresindeki bir kontrolde görüntülemek için? Ya da bir dosyaya kaydeder misin? –

+1

Aslında, herhangi bir kodu değiştirmek zorunda kalmadan konsol çıktısını görebileceğiniz xcode konsol penceresi gibi bir şey umuyordum. Stdout'u gösteren bir günlük de iyi olurdu. –

cevap

23

üzerinde test

, sen winbase.h OutputDebugString işlevini kullanarak Visual Studio 2010 bir Win32 uygulaması, printf benzeri işlevleri kullanabilir.

Nasıl yapılacağını gösteren basit bir program yazdım.

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

OutputDebugString işlevi parametresi olarak bir LPCSTR alır. Yazdırmadan önce dizeyi biçimlendirmek için sprintf_s'u kullandım.

Bu, sonucu Visual   Studio   2010 çıkış penceresine yazdırır.

Umarım yardımcı olur!

+0

Açıkçası 256 sadece örnek var ama bu yaklaşımı seviyorum. Kesinlikle aklımda vardı. –

+0

Elbette, sadece bir örnek. Kolaylık için bir sınıf/fonksiyona sarabilirsiniz. Memnun kaldım! Şerefe! – rbento

+0

'wchar_t str [256]; wsprintf (str, L "Çalışır! - sayı:% d \ n", sayı); OutputDebugString (str); –

12

Bunu geçmişte AllocConsole işlevini kullanarak yaptığımı biliyorum, ancak beklediğimden biraz daha zor olduğunu da hatırlıyorum.

AllocConsole üzerinde hızlı bir Google araması, alakalı görünen bir Windows Developer Journal article olduğunu gösterir. Oradan, hatırladığım şeye benziyor, belirsiz olduğu gibi.

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

Bazı nedenlerden dolayı bu, renkli çıktı – paulm

11

Konsol penceresine ihtiyacınız vardır. Şimdiye kadar elde etmenin en kolay yolu bir linker seçeneğini değiştirmektir: Project + Properties, Linker, System, SubSystem = Console. bir ana() yöntemi ekleyin:

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

ile çalışmıyor. _tWinMain' yerine bir Win32 uygulaması için 'WinMain 'adlı ana işlevdir –

9

Teşekkür TORAK cevabın için. Bana çok yardımcı oldu.

Daha büyük bir geri kaydırma arabelleğe ihtiyacım vardı, bu nedenle API functions ürününe göz attıktan sonra birkaç ekleme yaptık. diye burada paylaşılan bu başka kimse yardımcı olur:

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

Bu 9999 hatlarına geri kaydırma (ekran tampon) yüksekliği artar. Kesinlikle sizin soruya cevap Windows XP ve Windows 7'de

+2

Benim gibi kes-and-past'leri aramaları kaydetmek için, bir de ve İşlev ve bayrak tanımları için –

6

böyle bir şey giderdim VS çıktı penceresine yazdırmak da değişen mevcut Printf en gerektirmez ve olmaz bir başka yolu:

#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

bir deha! – Skynight