2009-02-19 17 views
14

सी/सी ++ में लिखे गए विंडोज जीयूआई अनुप्रयोगों में 'विनमेन' एक प्रविष्टि बिंदु ('मुख्य' के बजाय) है। इसकी मेरी समझ यह है कि संकलक सी रनटाइम द्वारा 'मुख्य' फ़ंक्शन कहलाता है। यह 'मुख्य' फ़ंक्शन जीयूआई के लिए आवश्यक वातावरण स्थापित करता है और 'विनमेन' (उदाहरण हैंडल इत्यादि निर्दिष्ट करता है) में कॉल करता है।WinMain का उपयोग किये बिना मैं विंडोज़ एप्लिकेशन कैसे लिख सकता हूं?

संक्षेप में, मेरा मानना ​​है कि कंसोल और जीयूआई आवेदन स्टार्टअप निम्नलिखित तरीके से अलग करने के लिए:

कंसोल आवेदन: सी रनटाइम -> 'मुख्य' समारोह (हैंड-कोड)

जीयूआई आवेदन: सी रनटाइम -> 'मुख्य' फ़ंक्शन (कंपाइलर-जेनरेट) -> 'विनमेन' फ़ंक्शन (हाथ-कोडित)

मैं दोनों इस समझ को सत्यापित करना चाहता हूं और यह पता लगाना चाहता हूं कि मैं विंडोज़ को कैसे कोड कर सकता हूं जीयूआई सिर्फ 'मुख्य' फ़ंक्शन के साथ (यानी 'WinMain' लिखने के बिना)।

उत्तर

15

आपके पास गलत समझ है। मुख्य और WinMain के बीच अंतर, कुछ भिन्न प्रारंभिक कोड के अलावा, पैरामीटर इसे पारित किया गया है। इस तरह

मुख्य दिखता है:

int main(int argc, char* argv[]); 

WinMain इस तरह दिखता है जबकि:

int WINAPI WinMain(HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow 
); 

कुछ सेटअप करने के लिए उन पैरामीटर है और कॉल करने, और कहा कि स्टार्टअप कोड है। जब आप किसी प्रोग्राम को संकलित और लिंक करते हैं, तो लिंकर पैरामीटर में से एक प्रविष्टि बिंदु होता है, और यह कंसोल या जीयूआई ऐप के आधार पर स्टार्टअप कोड का एक अलग बिट होगा।

आप निश्चित रूप से अपना खुद का स्टार्टअप कोड लिख सकते हैं, बस अपनी विज़ुअल सी ++ स्रोत निर्देशिका में जाएं और आप स्टार्टअप कोड पा सकते हैं, इसे crt0.c कहा जाता है और यह वीसी \ crt \ src निर्देशिका में है।

6

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

क्या स्थिर हिस्सा कॉल करने की अपेक्षा करता है वह ट्विकेबल हो सकता है। उदाहरण के लिए, विजुअल स्टूडियो में लिंकर सेटिंग्स में एंट्री पॉइंट नाम के लिए एक फ़ील्ड है।

+0

तो कंसोल और जीयूआई आवेदन मामलों में निष्पादन का आदेश क्या है? क्या स्थिर दो भाग उन मामलों में अलग है? सी रनटाइम कहां फिट है? –

+0

पहले स्थिर भाग निष्पादित किया जाता है, फिर यह उपयोगकर्ता द्वारा लागू प्रविष्टि बिंदु को कॉल करता है। यह अलग हो सकता है या यह वही हो सकता है, लेकिन लिंकर सेटिंग के आधार पर कॉल को विभिन्न प्रविष्टि बिंदुओं से जोड़ सकता है। आप इस स्थिर भाग के बारे में सोच सकते हैं क्योंकि यह सी रनटाइम का हिस्सा है। – sharptooth

8

बस मुख्य के साथ, आप Winmain को कोड नहीं कर सकते। औचित्य के लिए, निम्नलिखित बयानों http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx

से ले जाया गया [Windows प्रोग्रामिंग में,] क्यों आवेदन प्रवेश बिंदु मुख्य आमंत्रित नहीं किया गया? खैर, एक बात के लिए, मुख्य नाम पहले से ही लिया गया था, और विंडोज़ के पास वैकल्पिक परिभाषा आरक्षित करने का अधिकार नहीं था। तब कोई सी भाषा मानकीकरण समिति नहीं थी; सी था जो डेनिस ने कहा था, और इसकी शायद ही गारंटी थी कि डेनिस सी भाषा के किसी भी भविष्य संस्करण में विंडोज स्रोत कोड संगतता को संरक्षित करने के लिए कोई विशेष कदम उठाएगा। चूंकि के & आर ने यह निर्दिष्ट नहीं किया कि कार्यान्वयन मुख्य कार्य के स्वीकार्य रूप को बढ़ा सकता है, यह पूरी तरह से संभव था कि कानूनी सी कंपाइलर था जो मुख्य रूप से गलत घोषित कार्यक्रमों को अस्वीकार कर देता था। वर्तमान सी भाषा मानक मुख्य रूप से कार्यान्वयन-विशिष्ट मुख्य परिभाषाओं को मुख्य रूप से अनुमति देता है, लेकिन सभी कंप्यूटर्स को का समर्थन करने के लिए Windows प्रोग्राम संकलित करने के लिए इस नए विंडोज-विशिष्ट संस्करण की आवश्यकता होती है, जो आप लेखन के लिए उपयोग कर सकते हैं संकलितों के सेट को पूरी तरह प्रतिबंधित कर देंगे विंडोज प्रोग्राम

अगर आपको लगता है कि बाधा पर काबू पाने में कामयाब रहे, आप समस्या कि मुख्य के Windows संस्करण कुछ इस तरह होना चाहिए था होगा:, प्रदर्शन किया गया था

int main(int argc, char *argv[], HINSTANCE hinst, 
     HINSTANCE hinstPrev, int nCmdShow); 

रास्ता सी लिंकेज के कारण सभी किसी फ़ंक्शन की विविधताओं को पैरामीटर पर आम सहमति थी, जो उनके समान थे। इसका अर्थ यह है कि विंडोज संस्करण को अपने पैरामीटर को सबसे लंबे समय तक मौजूदा संस्करण के अंत में जोड़ना होगा, और फिर आपको अपनी उंगलियों को पार करना होगा और पर आशा करना होगा कि सी भाषा ने कभी भी मुख्य का दूसरा वैकल्पिक संस्करण नहीं जोड़ा है। यदि आप इस मार्ग पर गए, तो आपकी क्रॉस उंगलियां आपको विफल कर दीं, क्योंकि यह बदल जाती है कि कुछ समय बाद एक तीसरा पैरामीटर मुख्य में जोड़ा गया था, और यह आपके विंडोज-अनुकूल संस्करण से विवादित था।

मान लीजिए कि आप डेनिस को यह मानने में कामयाब रहे कि मुख्य के तीन-पैरामीटर संस्करण को अनुमति न दें। आपको अभी भी उन के साथ पहले दो पैरामीटर के साथ आना होगा, जिसका अर्थ है कि प्रत्येक प्रोग्राम के स्टार्टअप कोड में कमांड लाइन पार्सर होना आवश्यक है। 16-बिट दिनों में, लोग हर बाइट को बचाने के लिए scrimped। उन्हें बताते हुए, "ओह, और आपके सभी प्रोग्राम 2KB बड़े होने जा रहे हैं" शायद आपको मित्रों के बहुत कुछ नहीं मिलेंगे। मेरा मतलब है, यह एक फ्लॉपी डिस्क से I/O के चार सेक्टर हैं!

लेकिन शायद कारण यह है कि विंडोज प्रविष्टि बिंदु अलग-अलग नाम दिया गया था, यह जोर देना है कि यह एक अलग निष्पादन पर्यावरण है। यदि इसे मुख्य कहा जाता है, तो लोग कंसोल पर्यावरण के लिए डिज़ाइन किए गए सी प्रोग्राम लेते हैं, उन्हें अपने विंडोज कंपाइलर में फेंक देते हैं, और फिर उन्हें विनाशकारी परिणामों के साथ चलाते हैं।

आशा है कि यह आपके संदेह को साफ़ करेगा।

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

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