2010-06-24 19 views
7

मैंने SO पर कुछ अन्य प्रश्नों को देखा और यह स्पष्ट नहीं है कि सी, WINAPI के ऊपर, नीचे या उसके साथ सी बनाया गया है या नहीं। उदाहरण के लिए, क्या कोई शुद्ध सी में कुछ लिख सकता है जो खिड़की खोलने में सक्षम था, या क्या उन्हें विंडोज एपीआई का उपयोग करने की आवश्यकता होगी?सी और विंडोज एपीआई के बीच संबंध क्या है?

मैंने विंडोज़ एपीआई संस्करण (CreateFile) बनाम फ़ाइल (फॉपेन) खोलने के सी (लाइब्रेरी?) संस्करण के बीच समानताएं देखीं जो मुझे आश्चर्य करती है कि कोई दूसरे के लिए सिर्फ एक रैपर है या नहीं। क्या कोई जानता है?

यदि खिड़कियां चल रही हैं; एक प्रोग्रामर को विंडोज एपीआई का उपयोग करने के लिए प्रोग्राम करने के लिए मजबूर होना पड़ता है ताकि प्रोग्राम कुछ चल रहा हो या प्रोग्रामर विंडोज एपीआई का उपयोग न कर सके और सीधे हार्डवेयर तक पहुंच सके (यानी विंडोज ऑपरेटिंग सिस्टम हार्डवेयर तक पहुंच की रक्षा करता है)?

जो विंडोज़ सीई की खिड़कियों के विभिन्न संस्करणों के बीच अधिक पोर्टेबल है। प्रलेखन जो मैंने पाया (जो अब बदल गया है) कहता है कि CreateFile केवल विंडोज सीई के संस्करण 2.0 पर वापस चला जाता है (यहां: http://msdn.microsoft.com/en-us/library/ms959950.aspx - बहुत नीचे दिए गए लिंक पर नोट पर ध्यान दें जो समर्थित संस्करण जानकारी बदल दी गई है) । तो विंडोज़ सी संस्करण 1 के लिए उपयोग करने वाला क्या है? दूसरे शब्दों में सी कार्यों का उपयोग कर प्रोग्रामिंग है या WINAPI लेबल वाले फ़ंक्शन विंडोज सीई के सभी संस्करणों पर काम करने की अधिक संभावना है?

मैं के बारे में प्रोग्रामिंग Windows CE एक किताब में निम्नलिखित पढ़ सकते हैं और यह मुझे उलझन में है, इसलिए ऊपर सभी सवालों का निम्न में से अर्थ निकालने के संदर्भ में बेहतर समझा जा सकता:

Windows CE सबसे का समर्थन करता है विंडोज एनटी और विंडोज 98 पर एक ही फाइल I/O फ़ंक्शन पाए गए हैं। वही Win32 API कॉल, जैसे CreateFile, ReadFile, WriteFile और CloseFile, सभी समर्थित हैं। एक विंडोज सीई प्रोग्रामर हालांकि कुछ मतभेदों से अवगत होना चाहिए। सबसे पहले, मानक सी फ़ाइल I/O फ़ंक्शन, जैसे कि फॉपेन, फ़्रेड, और fprintf, विंडोज सीई के तहत समर्थित नहीं हैं। इसी तरह, पुराने Win16 मानकों, _lread, _lwrite, और _llseek, समर्थित नहीं हैं। यह वास्तव में एक बड़ी समस्या नहीं है क्योंकि इन सभी कार्यों को आसानी से विंडोज सीई फ़ाइल कार्यों को कोड की एक छोटी राशि के साथ लपेटकर कार्यान्वित किया जा सकता है।

रैपिंग की मेरी समझ आप रैप करने के लिए कुछ है करने के लिए है कि, यह देखते हुए कि यह कैसे लगता है कि Win16 और ग पुस्तकालय उपलब्ध नहीं हैं वह fopen की अपनी खुद की ग की तरह संस्करण बनाने के लिए CreateFile समारोह रैप करने के लिए यह कहते हुए किया जाता है ? (केवल एक चीज जिसे मैं जानता हूं वह असेंबली है, और यदि वह लपेटने का सुझाव दे रहा था तो उसे इस तरह के आकस्मिक तरीके से नहीं लिखा जाएगा।)

उपरोक्त को देखते हुए, सी के बीच निर्भरता संबंध क्या है भाषा (वाक्यविन्यास, डेटा संरचनाएं, प्रवाह नियंत्रण), सी फ़ंक्शन लाइब्रेरी (उदा। fopen), और windows api (ex। CreateFile)?

+3

कृपया प्रश्न अपडेट करें। आप इस सवाल के मालिक हैं। टिप्पणियां न जोड़ें। वास्तव में पोर्टेबिलिटी की अपनी परिभाषा के साथ सवाल में सुधार। –

उत्तर

17

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

+5

और टेक्स्ट डिस्प्ले से पहले भी मुख्यधारा थी। एक कारण printf printf है और displayf नहीं है :) – Cogwheel

+10

असल में, 'fopen' * * सीधे' CreateFile' के संदर्भ में लिखा गया है। यदि आप इसके कार्यान्वयन का पालन करते हैं, तो अंततः सीआरटी स्रोत (विजुअल स्टूडियो के साथ शामिल) के ओपन सी में 'CreateFile' को कॉल करता है)। –

+4

ऊपर मेरी टिप्पणी स्पष्ट रूप से केवल विंडोज पर लागू होती है। 'फॉपेन' का उपयोग करने का बिंदु यह है कि यह किसी भी सी कार्यान्वयन पर उपलब्ध है और जो भी फाइलें खोलने के लिए "मूल" विधि का उपयोग करता है, उस प्लेटफ़ॉर्म पर होता है ... विंडोज पर यह 'CreateFile' है, लिनक्स पर यह' खुला 'है, आदि ... –

10

सी जीयूआई के बारे में कुछ भी नहीं जानता है, और ऑपरेटिंग सिस्टम के बारे में बहुत कम है। सी में ग्राफिक्स-वार जो भी आप करते हैं, वह पुस्तकालयों के उपयोग के माध्यम से होता है, जिसमें से Win32 एपीआई एक उदाहरण है।

5

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

1

विंडोज़ सहित अधिकांश ऑपरेटिंग सिस्टम सी (और या असेंबलर) में लिखे गए हैं। लाइब्रेरी को तब मूल ऑपरेटिंग सिस्टम के लिए प्रत्येक ऑपरेटिंग सिस्टम के लिए संशोधित किया जाता है। (सॉकेट, फ़ाइलें, मेमोरी, आदि ...)।

WINAPI पुस्तकालयों का एक समूह है (सी और/या असेंबलर में लिखा गया है) जो ओएस के भीतर कार्यक्षमता तक पहुंच की अनुमति देता है।

यह आपके प्रश्न को बदलने के बाद विंडोज से संबंधित नहीं है, मुझे लगता है कि आप जो समझने की कोशिश कर रहे हैं वह एक ओएस (विंडोज़ या अन्य) का बूटस्ट्रैपिंग है।
The book Operating Systems Design and implementation मिनिक्स के कार्यान्वयन पर चर्चा करता है (कौन सा लिनक्स आधारित है)।

4

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

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

हाँ, सी पुस्तकालय के सबसे अंतर्निहित ओएस (उदाहरण के लिए) विंडोज, fopen और fwrite पर उपयोग करता है ताकि अंत में CreateFile और WriteFile फोन करेंगे, लेकिन लिनक्स पर वे अंततः open और write बजाय फोन करता हूँ।

2

मैं ग के बीच समानता देखा (पुस्तकालय?) एक फ़ाइल (fopen) बनाम विंडोज़ API संस्करण (CreateFile)

आश्चर्य की बात नहीं खोलने का संस्करण। वे समान चीजें करते हैं।

[है] एक दूसरे के लिए सिर्फ एक रैपर है? क्या कोई जानता है?

आप नहीं ढूंढ सकते क्योंकि स्रोत कोड स्वामित्व में है और एक व्यापार रहस्य के रूप में रखा गया है। इससे कोई फर्क नहीं पड़ता कि कौन सा "मौलिक" है। आप विंडोज़ प्रोग्राम से विंडोज एपीआई का उपयोग करते हैं। आप सी प्रोग्राम से सी एपीआई का उपयोग करते हैं।

ध्यान दें कि इससे कोई फर्क नहीं पड़ता। आप सी एपीआई या विंडोज एपीआई इंटरमीस्ड का उपयोग कर सकते हैं।

यदि खिड़कियां चल रही हैं; क्या किसी ने इसे चलाने के लिए विंडोज एपीआई का उपयोग करने के लिए मजबूर किया है या क्या वे विंडोज़ को पूरी तरह से बाईपास कर सकते हैं और सीधे हार्डवेयर तक पहुंच सकते हैं?

"सीधे हार्डवेयर तक पहुंचें"? इसका क्या मतलब है? यदि खिड़कियां चल रही हैं, तो .... अच्छा ... विंडोज चल रहा है। विंडोज हार्डवेयर तक आपकी पहुंच को मध्यस्थ करता है।

विंडोज़ को बाईपास करने के लिए बूटकैम्प या GRUB या कुछ अन्य बूटलोडर का उपयोग करें और "हार्डवेयर तक सीधी पहुंच" है।

यदि वे कर सकते हैं, तो हार्डवेयर को नुकसान पहुंचा सकता है यदि आप नहीं जानते कि आप क्या कर रहे हैं?

इसका क्या अर्थ है? क्या आप पूछ रहे हैं कि क्या आप अपने ड्राइवरों का दुरुपयोग करके कुछ घुमावदार मीडिया (यानी, डिस्क) को "नुकसान" पहुंचा सकते हैं? आप अपनी हार्ड डिस्क को दूषित कर सकते हैं इससे कोई फर्क नहीं पड़ता कि आप कौन सी ओएस चल रहे हैं या नहीं चल रहे हैं। एक विशेषाधिकार प्राप्त खाता और गूंगा सॉफ्टवेयर डिस्क पर खराब डेटा लिख ​​सकता है। क्या यह "क्षति" के रूप में गिना जाता है?

कौन सा पोर्टेबल है?

इसका क्या अर्थ है? एक और विंडोज कंप्यूटर के लिए? एक कंप्यूटर के लिए विंडोज नहीं चल रहा है? तुम किसके बारे में पूछ रहे हो "पोर्टेबल" से आपका क्या मतलब है, इसे परिभाषित करने के लिए कृपया अपने प्रश्न को स्पष्ट करें।

खिड़कियों

के बाद से विभिन्न विंडोज परस्पर असंगत हैं, मैं आम तौर पर केवल POSIX मानक पुस्तकालयों का उपयोग करने और सभी विंडोज एपीआई से बचने का सुझाव के विभिन्न संस्करणों के बीच

हालांकि, कुछ विंडोज संस्करण (उदाहरण के लिए विंडोज बनाम विंडोज़ "सर्वर" के लिए विंडोज मोबाइल) अनिवार्य रूप से पूरी तरह से असंगत हैं। ओएस के दोनों सॉफ्टवेयर पर चलाने के लिए सॉफ्टवेयर के किसी भी हिस्से के लिए बहुत कम कारण है। पोर्टेबिलिटी कोई फर्क नहीं पड़ता। सर्वर पर फ़ोन ऐप चलाने का प्रयास क्यों करें?


संपादित

तो तल पर सी भाषा (निकटतम हार्डवेयर के लिए), तो खिड़कियों एपीआई Windows API के शीर्ष पर सी पुस्तकालय theres अगले, तो?

यह समझ में नहीं आता है। आप दो असंबंधित चीजों को मिला रहे हैं। "भाषा" और "पुस्तकालयों" का एक-दूसरे के साथ बहुत कम संबंध नहीं है।

इसके अलावा, एपीआई ऑपरेटिंग सिस्टम नहीं है। तो हर समय विंडोज़ "एपीआई" का उपयोग करके, आप इसे और अधिक भ्रमित कर रहे हैं इसकी आवश्यकता है।

यहां देखने का एक तरीका है।

  • विंडोज ऑपरेटिंग सिस्टम में कई एपीआई हैं। अंतर्निहित फ़ंक्शन लाइब्रेरीज़ हैं जो एप्लिकेशन इंटरफ़ेस का हिस्सा नहीं हैं। वे "आंतरिक" हैं।
  • इसमें मूल विंडोज एपीआई है। सी
  • से कॉल करने योग्य यह एक POSIX API है। सी से कॉल करने योग्य कुछ मामलों में, पॉज़िक्स एपीआई आमतौर पर विंडोज एपीआई का उपयोग करता है।
  • जैसे Windows के रूप में
+0

आपकी प्रतिक्रिया पढ़ने के बाद ऐसा लगता है कि पोर्टेबल की मेरी परिभाषा बंद हो सकती है। पोर्टेबिलिटी के बारे में शीर्ष पर टिप्पणी देखें। – xaler7

+0

मुझे सीधे प्रश्न संपादित करने के लिए कहने के लिए धन्यवाद। – xaler7

+2

मुझे नहीं लगता कि इनके लिए स्रोत कोड एक व्यापार रहस्य है। विजुअल स्टूडियो के साथ माइक्रोसॉफ्ट जहाजों fopen.c। – Ken

0

ऑपरेटिंग सिस्टम WINAPI पुस्तकालयों कि कुछ ऑपरेटिंग सिस्टम कार्यक्षमता के लिए पहुँच प्रदान और कभी कभी हार्डवेयर के साथ संपर्क, इन पुस्तकालयों सी में लिखे गए हैं

0

कार्ल Norum ने बताया कि सी विंडोज से पहले लंबे समय तक अस्तित्व में होते हैं, लेकिन यह न भूलें कि विंडोज एपीआई प्रकार एमएस-डॉस एपीआई के साथ शुरू हुआ, जिस तरह सीपी/एम एपीआई के साथ शुरू हुआ। सी केवल सीपी/एम से पहले एक छोटा सा समय अस्तित्व में था।

बहुत से उत्तरों का अर्थ यह है कि विंडोज एपीआई सी पर बनाया गया है, लेकिन यह भी संदिग्ध लगता है। __stdcall PASCAL का समानार्थी है, जो माइक्रोसॉफ्ट के सी कंपाइलर्स में एक कीवर्ड था क्योंकि विंडोज एपीआई पास्कल पर बनाया गया था। __cdecl विजुअल स्टूडियो द्वारा संकलित सी और सी ++ प्रोग्राम में फ़ंक्शन कॉल के लिए डिफ़ॉल्ट है लेकिन यह एपीआई को कॉल पर काम नहीं करता है।

सी और विंडोज एपीआई के बीच संबंध यह है कि वे एक-दूसरे के साथ काम करने में सक्षम हैं।

+0

फिर पास्कल: सच नहीं, रेमंड चेन द्वारा इस पोस्ट को पढ़ें: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/02/47184.aspx#47343 – Amro

+0

अमरो ने कहा "फिर पास्कल: सच नहीं , रेमंड चेन द्वारा इस पोस्ट को पढ़ें: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/02/47184.aspx#47343 "। उस पोस्ट में, मैंने पढ़ा "लगभग सभी Win16 कार्यों को पास्कल कॉलिंग सम्मेलन के रूप में निर्यात किया जाता है।" वह पोस्ट Win32 के बारे में बात नहीं करता है। –

+0

उस लेख ने एक स्पष्टीकरण दिया कि Win16 एपीआई ने शुरुआत में पास्कल [कॉलिंग कन्वेंशन] (https://en.wikipedia.org/wiki/X86_calling_conventions) का उपयोग क्यों किया (आजकल Win32 stdcall सम्मेलन का उपयोग करता है, पहले की एक भिन्नता)। प्वाइंट न तो Win16 और न ही Win32 पास्कल में कभी लिखा गया था, यह असेंबली और सी का मिश्रण है ... यहां तक ​​कि संकेत भी है कि सी रनटाइम के भविष्य के संस्करणों को आंतरिक रूप से सी ++ में लिखा जाएगा: http: //blogs.msdn।com/b/vcblog/archive/2014/06/10/the-great-crt-refactoring.aspx – Amro

1

WINAPI एक इंटरफेस प्रदान करता है जो सी में डेवलपर्स WINAPI कार्यक्षमता का उपयोग करने के लिए उपयोग कर सकते हैं। सी ++ प्रोग्राम इसका भी उपयोग कर सकते हैं।

0

एक मजेदार नोट के रूप में, आप वास्तव में ऑटोआईटी http://www.autoitscript.com/autoit3/ पर एक नज़र डालकर विंडोज एपीआई की 'पावर' पर एक संभाल पा सकते हैं। ऑटोआईट एक बहुत छोटी स्क्रिप्टिंग भाषा है जो जीयूआई बना सकती है, कमांड लाइन ऐप चला सकती है, विंडोज़ और प्रोसेस में हेरफेर कर सकती है। हाँ, यह फ़ाइल I/O और नेटवर्किंग करता है।

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