2011-01-29 11 views
13

से संबंधित # डिफाईन है, मैं एक मैक्रो के साथ मुख्य बना रहा हूं और उपयुक्त समय उत्पन्न करने के लिए संकलित समय,/सबस्टेस्टम: विन्डोज़ या/सबस्टेस्टम: कंसोल पर चयनित उप-सिस्टम की जांच करने में सक्षम होना चाहिए। मुख्य कार्य। क्या कोई # डिफाईन है जो मैं देख सकता हूं कि यह पूरा करता है?क्या उप-प्रणाली

+0

आपको मुख्य कार्य नहीं करना चाहिए, क्योंकि इसे उत्पन्न करना आपके लिए बेकार है और दूसरों के लिए बाधा है। अर्थात। यह करने के लिए नकारात्मक उपयोगिता है। लेकिन यदि आप ऐसा करते हैं, जैसे 'मुख्य' फ़ंक्शन उत्पन्न करने पर नरक-झुकाव, तो * मानक 'मुख्य' * उत्पन्न करें। यह ठीक काम करता है चाहे निर्माण के उपप्रणाली। नोट: माइक्रोसॉफ्ट टूल्स के साथ, जो इस विभाग में थोड़ा चुनौतीपूर्ण हैं, लिंकर विकल्प '/ एंट्री: mainCRTStartup' सेट करें जब तक कि आप एक एमएफसी एप्लीकेशन नहीं कर रहे हैं, इस मामले में आप दूसरों की समस्या (अर्थात् माइक्रोसॉफ्ट) की समस्या के खिलाफ हैं 'मुख्य' पर लेने का वही वास्तव में बुरा विचार था। –

उत्तर

4

यदि आप अपनी लाइब्रेरी के उपयोगकर्ताओं (या जो भी हो) के लिए चीजों को आसान बनाने की कोशिश कर रहे हैं, तो आप अपने मैक्रो से केवल WinMain और main दोनों उत्पन्न कर सकते हैं। डिफ़ॉल्ट रूप से लिंकर main पर शुरू करने के लिए कंसोल ऐप्स सेट करता है, और Win32 ऐप्स WinMain पर शुरू करने के लिए सेट करता है। अन्य "मुख्य" फ़ंक्शन को अनदेखा कर दिया जाएगा।

(संभवतः कोड के बाकी, मुख्य कार्य तर्कों (argc, argv, hInstance, आदि) में से किसी का उपयोग नहीं करता है, तो यह दोनों के साथ काम करने के लिए।)

_CONSOLE परिभाषित किया जा सकता है , लेकिन यह स्वचालित रूप से प्रकट नहीं होता है; आपको इसे प्रोजेक्ट गुणों में मैन्युअल रूप से जोड़ना होगा। दूसरी तरफ स्टार्टअप प्रतीक का चयन स्वचालित है। तो बस दोनों कार्यों को प्रदान करना, और लिंकर चुनने देना, जीवन को आसान बना सकता है, क्योंकि प्रोजेक्ट निर्माता को कुछ भी सेट अप करने की आवश्यकता नहीं होती है, और वास्तव में विंडोज़ से कंसोल ऐप (संभावित रूप से यहां तक ​​कि प्रति-कॉन्फ़िगरेशन) को स्विच किए बिना स्विच कर सकता है कुछ भी।

11

_CONSOLE आपके लिए चाल चलाना चाहिए।
यदि आप वास्तव में इस मार्ग पर जाना चाहते हैं तो आप #pragma comment(linker, "/subsystem:windows") या #pragma comment(linker, "/subsystem:console") का उपयोग करके उपप्रणाली का चयन कर सकते हैं।

+2

यह निश्चित रूप से बेहतर उत्तर है क्योंकि यह सीधे सिस्टम बनाम मैन्युअल रूप से निर्दिष्ट करने के मूल प्रश्न का उत्तर देता है। लिंकर को इसे निर्धारित करने (या परियोजना सेटिंग्स को बदलने) को देना। –

+0

'_CONSOLE' कैसे परिभाषित किया जाता है? – jww

3

ऐसा नहीं है कि यह वास्तव में कैसे काम करता है। आपको एक मूल विंडोज ऐप बनाम कंसोल ऐप में नाटकीय रूप से अलग कोड लिखना होगा। एक कंसोल ऐप में, आप आउटपुट का उत्पादन करने के लिए printf या cout का उपयोग करते हैं, यदि माउस के लिए कोई उपयोग नहीं है तो बहुत कुछ नहीं है। एक मूल विंडोज ऐप को एक संदेश लूप की आवश्यकता होती है और खिड़की को अद्यतन करने के लिए WM_PAINT संदेश का पता लगाने वाली विंडो प्रक्रिया के साथ एक विंडो बनाना आवश्यक है। आदि।

लेकिन आप कोड लिख सकते हैं जो दोनों करता है। बस एक मुख्य() और WinMain() फ़ंक्शन दोनों लिखें, सीआरटी स्वचालित रूप से सही कॉल करता है।

+0

+1: मैं दोनों कार्यों को लिखता हूं। – Puppy

+1

जबकि आपके द्वारा किए गए बयान सत्य हैं, वे पूरी कहानी नहीं बताते हैं। एक छोटे से tweeks के माध्यम से कंसोल उपप्रणाली के साथ या उसके बिना काम करता है कि एक आवेदन लिखना संभव है। आम तौर पर यह एक खिड़की रहित अनुप्रयोग होगा (या यह केवल संदेश बॉक्स को कॉल कर सकता है) और कोई UI थ्रेड नहीं है। मानक पाइप गैर-कंसोल ऐप्स के लिए भी उपलब्ध हैं, हालांकि निश्चित रूप से उनके आउटपुट को तब तक नहीं देखा जाएगा जब तक कि रीडायरेक्ट नहीं किया जाता। – Tergiver

+2

दरअसल। मेरे सभी ऐप्स डिबग बिल्ड में कंसोल ऐप्स हैं, और यह मूल रूप से अतिरिक्त कोड की 6 पंक्तियां हैं: एक मुख्य फ़ंक्शन जो 'WinFain (0,0,0,0)' वापस करता है, सभी '#ifdef _CONSOLE' के अंदर। आपको वास्तव में '# ifdef' की भी आवश्यकता नहीं है। –

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

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