2015-08-24 36 views
5

bir Win32 GUI uygulaması konsola:Çıktı Ben konsola çıktı bu kodu çalıştı, Windows 10

#include <Windows.h> 

#include <stdio.h> 
#include <io.h> 
#include <fcntl.h> 

int APIENTRY WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPSTR  lpCmdLine, 
        int  nCmdShow) 
{ 
    AllocConsole(); 

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); 
    int hCrt = _open_osfhandle((long) handle_out, _O_TEXT); 
    FILE* hf_out = _fdopen(hCrt, "w"); 
    setvbuf(hf_out, NULL, _IONBF, 1); 
    *stdout = *hf_out; 

    HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE); 
    hCrt = _open_osfhandle((long) handle_in, _O_TEXT); 
    FILE* hf_in = _fdopen(hCrt, "r"); 
    setvbuf(hf_in, NULL, _IONBF, 128); 
    *stdin = *hf_in; 

    printf("Hello!"); 
} 

konsolu açılır hiçbir şey çıkarılmaktadır ama. Bu kodun nesi var?

Bütün bu önerileri çalıştı:

https://justcheckingonall.wordpress.com/2008/08/29/console-window-win32-app/

http://dslweb.nwnexus.com/~ast/dload/guicon.htm

How do I print to the debug output window in a Win32 app?

ama WinMain Windows 10 AllocConsole() ile oluşturulan konsola herhangi bir çıktı alamadım . Not: Aslında hiçbir gerçek pencere oluşturmadım. Windows 10'da, yukarıdaki çözümlerin çalışmasını engelleyen bir şey mi yoksa eksik olabilecek bir şey mi var (derleyici bayrakları veya benzeri) var mı?

Ne düşünüyorsunuz?

+1

Lütfen sorunuzu site dışı bağlantılarda sormayın. Lütfen denediğiniz kodu gösterin. Ne olmasını bekliyordun, ne oldu? Bu soru olduğu gibi konu dışıdır. –

+0

Bunu yaptığımda, 50 yanıt alacağım zaten bu zaten yanıtlanmıştı [duplicate]. – Zingam

+0

Bu yüzden denediğim kodu ekledim. – Zingam

cevap

4

ProXicT bağlantısından kabul edilen cevaba dayanarak birkaç değişiklik yapınız. Aşağıdaki kod std :: cout için çalışır.

#include <iostream> 
#include <cstdio> 
#include <fstream> 

#include <Windows.h> 


// For debugging 
#include <io.h> 
#include <fcntl.h> 


#define UNUSED(x) (void)(x)  // Unused param (C compatible - not applicable to expressions) 

class outbuf : public std::streambuf { 
public: 
    outbuf() { 
     setp(0, 0); 
    } 

    virtual int_type overflow(int_type c = traits_type::eof()) { 
     return fputc(c, stdout) == EOF ? traits_type::eof() : c; 
    } 
}; 

int CALLBACK 
WinMain (HINSTANCE hInstance, 
     HINSTANCE /*hPrevInst*/, // Unused param (C++ only) 
     LPSTR lpCmdLine, 
     int (nShowCmd)) 
{ 
    UNUSED(hInstance); 
// UNUSED(hPrevInst); 
    UNUSED(lpCmdLine); 
    UNUSED(nShowCmd); // This param is used 


    // create the console 
    if (AllocConsole()) { 
     FILE* pCout; 
     freopen_s(&pCout, "CONOUT$", "w", stdout); 
     SetConsoleTitle(L"Debug Console"); 
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED); 
    } 

    // set std::cout to use my custom streambuf 
    outbuf ob; 
    std::streambuf *sb = std::cout.rdbuf(&ob); 

    // do some work here 
    printf("Hello!\n"); 

    std::cout << "nShowCmd = " << nShowCmd << std::endl; 
    std::cout << "Now making my first Windows window!" << std::endl; 


    // make sure to restore the original so we don't get a crash on close! 
    std::cout.rdbuf(sb); 

    MessageBoxW (NULL, 
       L"Hello World!", 
       L"hello", 
       MB_OK | MB_ICONINFORMATION); 

    return 0; 
} 

DÜZENLEME:

yukarıdaki gibi ancak şeyiyle renklerle aynı şeyler:

#include <iostream> 
#include <cstdio> 
#include <fstream> 

#include <Windows.h> 


// For debugging 
#include <io.h> 
#include <fcntl.h> 


#define UNUSED(x) (void)(x)  // Unused param (C compatible - not applicable to expressions) 

class outbuf : public std::streambuf { 
public: 
    outbuf() { 
     setp(0, 0); 
    } 

    virtual int_type overflow(int_type c = traits_type::eof()) { 
     return fputc(c, stdout) == EOF ? traits_type::eof() : c; 
    } 
}; 

int CALLBACK 
WinMain (HINSTANCE hInstance, 
     HINSTANCE /*hPrevInst*/, // Unused param (C++ only) 
     LPSTR lpCmdLine, 
     int (nShowCmd)) 
{ 
    UNUSED(hInstance); 
// UNUSED(hPrevInst); 
    UNUSED(lpCmdLine); 
    UNUSED(nShowCmd); // This param is used 


    // create the console 
    if (AllocConsole()) { 
     FILE* pCout; 
     freopen_s(&pCout, "CONOUT$", "w", stdout); 
     SetConsoleTitle(L"Debug Console"); 

    } 

    // set std::cout to use my custom streambuf 
    outbuf ob; 
    std::streambuf *sb = std::cout.rdbuf(&ob); 

    // do some work here 

    printf("Hello!\n"); 

    HANDLE stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo; 
    WORD defaultConsoleTextAttributes; 
    GetConsoleScreenBufferInfo(stdHandle, &consoleInfo); 
    defaultConsoleTextAttributes = consoleInfo.wAttributes; 
    WORD currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "nShowCmd = " << nShowCmd << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_BLUE; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_BLUE | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_RED; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_RED | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_BLUE; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_RED; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_BLUE | FOREGROUND_RED; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 
    currentConsoleTextAttributes = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY; 
    SetConsoleTextAttribute(stdHandle, currentConsoleTextAttributes); 
    std::cout << "Now making my first Windows window!" << std::endl; 



    // make sure to restore the original so we don't get a crash on close! 
    std::cout.rdbuf(sb); 

    Sleep(5000); 
    ShowWindow(GetConsoleWindow(), SW_HIDE); 
    FreeConsole(); 

    MessageBoxW (NULL, 
       L"Hello World!", 
       L"hello", 
       MB_OK | MB_ICONINFORMATION); 

    return 0; 
} 

Şimdi bunların hepsi kalır ise diğer yöntemler 2015, Visual Studio ile 64 bit çalışmaz tam bir kayıt sınıfına dönüştürmek için.

5

Bu kodu deneyin.

AllocConsole(); 
HANDLE stdHandle; 
int hConsole; 
FILE* fp; 
stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
hConsole = _open_osfhandle((long)stdHandle, _O_TEXT); 
fp = _fdopen(hConsole, "w"); 

freopen_s(&fp, "CONOUT$", "w", stdout); 

printf("Hello console on\n"); 
std::cout << "Windows 10" << std::endl; 
+1

Not: 'include ve ' # _open_osfhandle 'çağrısı için gerekli

0

o zaman bunu başarmak için hem -mconsole ve -mwindows ait bağlayıcı bayrakları temin edebilir, size g ++ kullanıyorsanız ve başvurunuzun hep konsol ve bir GUI ikisine de sahip olmak istiyorsanız. Daha fazla detay için

See this answer.