2012-12-12 11 views
6

Win32 ऐप संकलित करते समय fprointf (stdout/stderr) विजुअल स्टूडियो में कहां प्रिंट करता है? मैं सुनता रहता हूं कि यह आउटपुट पर जाता है लेकिन मैं इसे नहीं देख सकता!विजुअल स्टूडियो 2012 सी ++ मानक आउटपुट

सी ++ में कंसोल विंडो के बिना आउटपुट लॉग को प्रिंट करने का मानक तरीका क्या है?

उत्तर

13

यदि आपका प्रोग्राम/SUBSYSTEM से जुड़ा हुआ है: विंडोज़ आपको कंसोल आउटपुट नहीं दिखाई देगा जब तक आप एक कंसोल आवंटित नहीं करते।

यहां आवंटित कंसोल विकल्प के लिए कोड है। इस विधि के साथ आपको लिंकर सेटिंग्स के साथ गड़बड़ करने या WinMain बनाने की आवश्यकता नहीं है।

static void OpenConsole() 
{ 
    int outHandle, errHandle, inHandle; 
    FILE *outFile, *errFile, *inFile; 
    AllocConsole(); 
    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = 9999; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    outHandle = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT); 
    errHandle = _open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE),_O_TEXT); 
    inHandle = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT); 

    outFile = _fdopen(outHandle, "w"); 
    errFile = _fdopen(errHandle, "w"); 
    inFile = _fdopen(inHandle, "r"); 

    *stdout = *outFile; 
    *stderr = *errFile; 
    *stdin = *inFile; 

    setvbuf(stdout, NULL, _IONBF, 0); 
    setvbuf(stderr, NULL, _IONBF, 0); 
    setvbuf(stdin, NULL, _IONBF, 0); 

    std::ios::sync_with_stdio(); 

} 

आप एक सांत्वना आवंटित करने के लिए सीधे आप भी/सबसिस्टम से सबसिस्टम बदल सकते हैं नहीं करना चाहते हैं: लिंकर सेटिंग्स की सबसिस्टम को बदलने के माध्यम से कंसोल: विंडोज़/सबसिस्टम करने के लिए। याद रखें जब/सबसस्टेम: कंसोल सक्षम है, गुई अभी भी पहले जैसा ही काम करेगा लेकिन विंडोज़ आपके आवेदन के साथ आपके लिए कंसोल विंडो बनाएगी।

मेरे क्यूटी कोड में जो कुछ भी आवश्यक है। हालांकि जब मैंने विजुअलस्टूडियो में एमएफसी की कोशिश की और लिंकर सेटिंग के माध्यम से उपप्रणाली को कंसोल पर सेट किया।

1>------ Build started: Project: MFCApplication1, Configuration: Debug Win32 ------ 
1> MFCApplication1.cpp 
1>msvcrtd.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup 
1>X:\Test\VC.110\MFCTest\MFCApplication1\Debug\MFCApplication1.exe : fatal error LNK1120: 1 unresolved externals 

यह() सांत्वना अनुप्रयोगों और खिड़कियों अनुप्रयोगों में WinMain में मुख्य करने के लिए दोषी प्रवेश बिंदु के कारण होता है: मैं निम्नलिखित त्रुटि मिली। इसे ठीक करने के लिए मुझे उन्नत लिंकर सेटिंग्स की प्रविष्टि बिंदु सेटिंग में निम्नलिखित जोड़ना पड़ा: "wWinMainCRTStartup"

टिप्पणियों में बेन वोइग ने वैकल्पिक विधि का सुझाव दिया। सबसिस्टम को बदलने के लिए एडिटबिन का उपयोग करने के लिए प्रवेश बिंदु में बदलाव की आवश्यकता नहीं है। वास्तव में यही मामला है। मैं प्रवेश बिंदु से हटाया और खिड़कियों वापस रख बनाया परीक्षण आवेदन तो editbin इस्तेमाल किया निम्न आदेश का उपयोग कर सबसिस्टम बदलने के लिए सबसिस्टम के रूप में रखा:

X:\Test\VC.110\MFCTest\MFCApplication1\Debug>editbin MFCApplication1.exe /SUBSYSTEM:CONSOLE 
Microsoft (R) COFF/PE Editor Version 10.00.40219.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

और मैं उत्पादन मैं कंसोल में होने की उम्मीद है:

X:\Test\VC.110\MFCTest\MFCApplication1\Debug>MFCApplication1.exe 
Hello from a windows application! 

नोट: editbin विधि आप इस हर बार जब आप निष्पादन योग्य अद्यतन renable करने की जरूरत है।

और अंततः आपके पास कंसोल printf या std :: cout काम करने के बाद या तो विधि पर। उदाहरण के लिए मेरे परीक्षण एमएफसी अनुप्रयोग में मैंने सीएमएफसीएप्लिकेशंस 1 एप क्लास के कन्स्ट्रक्टर को निम्न पंक्ति जोड़ा:

std::cout << "Hello from a windows application!" << std::endl; 
+0

मैं यह कहां कर सकता हूं? –

+0

यह लिंकर सेटिंग्स के उपप्रणाली टैब में है। यह क्यूटी में मेरे लिए काम करता है हालांकि अगर आप कंसोल उपप्रणाली का उपयोग करते हैं तो प्रविष्टि बिंदु परिवर्तनों के कारण मुझे एमएससी के लिए वीएफ2012 के तहत ऐसा करने में समस्या हो रही है। क्या आप एमएफसी का उपयोग कर रहे हैं? – drescherjm

+3

आप उपप्रणाली को बदलने के लिए 'एडिटबिन' का भी उपयोग कर सकते हैं - यह लिंकिंग प्रक्रिया को प्रभावित नहीं करेगा, इसलिए यह एंट्रीपॉइंट लुकअप तर्क को नहीं बदलेगा। –

संबंधित मुद्दे