2010-06-10 13 views
23

के बीच अंतर मैं वर्तमान में COM का अध्ययन कर रहा हूं। मैंने पाया कि COM DLL पारंपरिक डीएलएल आधारभूत संरचना पर बनाया गया है। जब हम COM DLL बनाते हैं, हम अभी भी आंतरिक COM सह-वर्गों तक पहुंचने के लिए पारंपरिक डीएलएल निर्यात विधियों पर भरोसा करते हैं।पारंपरिक डीएलएल और COM DLL

यदि COM बाइनरी स्तर पर पुन: उपयोग करने वाले घटक के लिए है, तो मुझे लगता है कि पारंपरिक डीएलएल एक ही चीज़ प्राप्त कर सकता है। वे दोनों कार्यों का पर्दाफाश करते हैं, वे बाइनरी दोनों हैं, तो COM दृष्टिकोण को बदलने का क्या मतलब है?

वर्तमान में, मैं महसूस कर रही है कि पारंपरिक DLL एक "फ्लैट" तरीके से तरीकों का पर्दाफाश, जबकि COM DLL एक "OOP" पदानुक्रम ढंग से तरीकों का पर्दाफाश किया है। और ओओपी तरीका एक बेहतर दृष्टिकोण प्रतीत होता है। क्या यह कारण हो सकता है कि COM क्यों प्रचलित है?

बहुत धन्यवाद।

+1

आपको क्या लगता है कि COM प्रचलित है? अगर मैं डीएलएल के डीएलएल की तुलना में अधिक डीएलएल क्लासिक 'सी' डीएलएल था तो मुझे आश्चर्य नहीं होगा। –

+0

आपकी टिप्पणी के लिए धन्यवाद। शायद मैं गलत हूँ। लेकिन ऐसा लगता है कि कई विंडोज फीचर्स COM पर बनाए गए हैं, जैसे ActiveX, OLE, यहां तक ​​कि .NET को COM सर्वर के संग्रह के रूप में बनाया गया है। तो मैं उस निष्कर्ष पर आया। – smwikipedia

उत्तर

28

नहीं, एक बड़ा अंतर है। कॉम,, वस्तुओं बनाने उजागर तरीकों के प्रबंध स्मृति, प्रकाशन प्रकार की जानकारी के प्रबंधन के सूत्रण के लिए एक अच्छी तरह से परिभाषित प्रोटोकॉल है। वहाँ व्यावहारिक रूप से कोई भाषा बाईं कि एक COM सर्वर का उपयोग का समर्थन नहीं करता है, कोई बात नहीं क्या भाषा में लिखा गया था।

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

यह अच्छी तरह से अधिक OOPy हो सकता है, COM विरासत का समर्थन नहीं करता क्योंकि OOP द्विआधारी स्तर पर संगत पाने के लिए बहुत मुश्किल है। उस समस्या को रनटाइम समर्थन की आवश्यकता होती है जो सभी कोड खरीदता है, वीएम जैसे .NET और Java।

+1

दूसरे अनुच्छेद के संबंध में, कुछ भाषाएं/ढांचे हैं, जो आपको सी ++ के बाहर एक मूल (गैर-COM) DLL का उपभोग करने की अनुमति देती हैं। उदाहरण के लिए, .NET के पास [पी/Invoke] (http://msdn.microsoft.com/en-us/magazine/cc164123.aspx) के माध्यम से इंटरऑप तंत्र का उपयोग करना आसान है। – hemp

+1

अंतर की दुनिया है। पी/Invoke एक एक कॉल-पर-एक-बार लड़ाई है। COM सर्वर बॉक्स के बाहर 95% काम नहीं करते हैं। –

+0

"कॉम सर्वर" को एक खुला कॉम ऑब्जेक्ट माना जाएगा जिसे संभावित ग्राहकों को उपभोग करने के लिए सेवा दी जा रही है? – RollRoll

12

एक COM DLL बस कॉम-विशिष्ट प्रविष्टि बिंदुओं वाला एक डीएलएल है। कॉम कॉम ऑब्जेक्ट्स बनाने के लिए कक्षा कारखानों का खुलासा करता है, इसलिए COM सर्वर द्वारा लागू कक्षा कारखानों में से किसी एक तक पहुंच प्राप्त करने का एक तरीका होना चाहिए। यही है DllGetClassObject करता है। इसके अलावा, COM DLL स्वयं पंजीकरण कर रहे हैं: वे अपने उपलब्ध वर्गों और इंटरफेस के विंडोज़ को सूचित कर सकते हैं। डीएलएल रजिस्टर करने के लिए प्रवेश बिंदु स्वयं DllRegisterServer है।

कुछ अन्य प्रविष्टि बिंदु हैं, लेकिन वे इन पंक्तियों के साथ हैं।

यदि DllRegisterServer के लिए एक अच्छी तरह से परिभाषित प्रविष्टि बिंदु नहीं था, तो ग्राहक डीएलएल को स्व-रजिस्टर करने में सक्षम नहीं होंगे। यह COM घटकों की स्थापना अधिक जटिल बना देगा।

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

जहां COM 'सी' से अलग है, मुख्य अंतर अनुबंधों की अवधारणा है। COM प्रोग्रामर को कार्यक्षमता के पदानुक्रमिक, शीर्ष-डाउन अपघटन के बजाय मॉड्यूल के बीच सार इंटरफेस के संदर्भ में सोचने के लिए प्रोत्साहित करता है। यह एक तरह का 'ओओपी' है, लेकिन यह शब्द बहुत अधिक उपयोग के लिए बहुत ढीला है, आईएमओ। अनुबंध-उन्मुख दृष्टिकोण के लाभ दृढ़ता से टाइप की गई, स्थिर रूप से जुड़े भाषाओं जैसे सी/सी ++ के लिए कई गुना हैं।

5

आप कॉम शुरू करने के लिए कारणों और इसके पीछे दर्शन के बारे में जानने के लिए चाहते हैं, मैं दृढ़ता से From CPP to COM

7

मैं आवश्यक कॉम के प्रथम अध्याय को पढ़ कर लगता है कि पढ़ने की सलाह आप का एक बहुत अच्छा विचार होगा COM का उपयोग क्यों करें।

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

+0

आपको "अंदरूनी ओएलई" भी पढ़ना चाहिए। – gonzobrains

4

मुख्य अंतर यह है कि COM बाइनरी संगतता को सक्षम बनाता है।

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

COM ने इंटरफेस की अवधारणा पेश की, जो अपरिवर्तनीय हैं इसलिए बिल्डों आदि के बीच बदला नहीं जाना चाहिए। प्रत्येक COM ऑब्जेक्ट को IU अज्ञात इंटरफ़ेस को कार्यान्वित करना चाहिए जिसमें क्वेरी इंटरफेस विधि शामिल है जिसका उपयोग अन्य समर्थित इंटरफेस को पॉइंटर्स के लिए ऑब्जेक्ट से पूछने के लिए किया जाता है ।

कॉम विनिर्देश सुनिश्चित करता है कि IUnknown इंटरफ़ेस तो भी DLL में एक ही जगह में हमेशा होता है, तो एक वस्तु अधिक इंटरफेस QueryInterface पद्धति अभी भी सुरक्षित रूप से कहा जा सकता है समर्थन करने के लिए संशोधित किया गया है।

3

COM के बारे में सोचने का सबसे अच्छा तरीका यह है कि आप इसे और आपके द्वारा बनाए गए ऑब्जेक्ट का उपयोग करके व्यक्ति के बीच अनुबंध के रूप में कल्पना करें।

कॉम संभालती

  1. कैसे संस्करण के लिए रिलीज
  2. भर में अपने वस्तु अपने वस्तु की खोज करने के लिए कैसे, भले ही आपके वस्तु एक DLL है जिसका नाम या एक अलग स्रोत से आए थे हो जाता है
  3. कैसे संदर्भ और (ढेर के संबंध में) अपने वस्तु को नष्ट
  4. कैसे आप काम करने के लिए सूत्रण उम्मीद, और नियमों को आसपास के सूत्रण/अपने वस्तु के लिए ताला लगा

कॉम एक मानक बन गया है क्योंकि आप की उम्मीद अनुबंध स्पष्ट करने के लिए जब आप कॉम के नियमों का उपयोग करके अपने DLL

जहाज होगा आप एक पारंपरिक DLL कि उपरोक्त वस्तुओं में से प्रत्येक को संभालती कर सकता है, जबकि, इस अभिव्यक्ति है आपके लिए

आप यह भी सही हैं कि COM ऑब्जेक्ट्स का खुलासा करता है जबकि अधिक पारंपरिक DLLS केवल कार्यों का पर्दाफाश करते हैं। आप अक्सर डेवलपर्स को सीधे सी में COM में पाए गए अनुबंधों का अनुकरण करने का प्रयास करेंगे, आमतौर पर आप उन्हें उनके डीएलएल में COM के क्लोन पहलुओं को देखेंगे (उदाहरण के लिए आप उन विधियों को देखेंगे जो फ़ंक्शन पॉइंटर्स के structs लौटाते हैं) ... my अनुभव यह है कि यदि आप सार्वजनिक डीएलएल बनाने के लिए COM का उपयोग नहीं करते हैं तो आप कुछ मामलों को याद करने की बाधाओं को बढ़ा रहे हैं, खासकर जब चित्र

+0

ओह, मुझे यकीन है कि मुझे कुछ आइटम याद आ रहे हैं COM हैंडल - कृपया उन्हें टिप्पणियों के रूप में देखें :-) – stuck

5

डीएलएल में विंडोज़ में कई उपयोग हैं। डीएलएल में कई प्रकार के लाइब्रेरी कोड संग्रहीत किए जाते हैं। इनमें से एक, उदाहरण के लिए, .NET असेंबली है, जो एक अलग जानवर है।

COM DLL "सादा बाइनरी पीई डीएलएल" से बेहतर नहीं है क्योंकि COM DLL भी एक सादा DLL है।क्या डीएलएल एक COM DLL को उजागर कर रहा है, संभवतः अन्य चीजों के अलावा, कुछ निर्यात जो एक निश्चित अनुबंध (हस्ताक्षर) [लुकअप एंट्री IU अज्ञात] से मेल खाते हैं, या यहां तक ​​कि कई प्रकार के कैनोनाइज्ड इंटरफेस [लुकअप एंट्री 'डुअल इंटरफेस'] की अनुमति नहीं देते हैं डीएलएल के अंदर विशिष्ट वस्तुओं का केवल तात्कालिकता, लेकिन कार्य नामों और पैरामीटर प्रकारों सहित सेवाओं की स्वचालित खोज भी।

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

इस लचीलेपन ने घटक पंजीकरण, डीसीओएम (नेटवर्क पर आविष्कार) इत्यादि सहित पूरे विशाल COM बुनियादी ढांचे को बनाने की इजाजत दी। यह विंडोज घटकों (उदाहरण के लिए डब्ल्यूएमआई) और कार्यालय में COM इंटरफेस प्रदान करने के बजाय सुविधाजनक है। अवयव। एडीओ जैसे COM के ऊपर कई अन्य लोकप्रिय इंटरफेस लागू किए गए थे।

यह सब अच्छा है, लेकिन COM किसी भी अर्थ में "प्रबल" नहीं होता है। सीएल डीएलएल डीएलएल की अल्पसंख्यक हैं। सादा डीएलएल और .NET DLL बहुत लोकप्रिय हैं। माइक्रोसॉफ्ट COM से बेहतर .NET इंटरफेस मानता है। कई यूनिक्स फिक्र और अन्य लोग डीएलएल को पूरी तरह से एक बुरा विचार मानते हैं, क्योंकि यह समान समय में रन-टाइम लिंकिंग सेवाएं प्रदान नहीं करता है कि यूनिक्स साझा वस्तुओं को हमेशा होता था। विंडोज़ डेवलपर होने के बावजूद, मुझे लगता है कि एसओएस एक बेहतर विकल्प प्रदान करते हैं, और मुझे आशा है कि उन्हें एक बार मिल जाए।

2

पहले से पोस्ट किए गए उत्तरों के अलावा, COM इंटरफेस एक प्रोग्रामिंग भाषा में बाइनरी डेटा ऑब्जेक्ट्स को स्वतंत्र तरीके से बेनकाब करते हैं, जो इन ऑब्जेक्ट्स को स्मृति प्रक्रिया स्थान में आवंटित करने की अनुमति देता है और दूसरे में मुक्त होता है। लुकअप marshalling और unmarshalling।

यह एन्कोडिंग के विवरण पर ध्यान दिए बिना तारों को पारित करने की अनुमति देता है यह निर्धारित करने के लिए कि एक शून्य टर्मिनेटर कहां हो सकता है। COM तारों को यूनिकोड तारों की गणना की जाती है।

आईडीएल में फेंको और टाइप लाइब्रेरी को डीएलएल में संकलित करें, और आपके पास स्वयं वर्णन करने वाले इंटरफेस हैं। सादे डीएलएल के साथ, आपको बाहरी दस्तावेज़ों से पता होना चाहिए कि उनके पास कौन सी विधियां हैं और वे क्या पैरामीटर लेते हैं।

COM मानक क्रॉस-प्लेटफॉर्म भी हो सकता है। Office समर्थन COM के मैक संस्करण, और यूनिक्स और यूनिक्स-जैसी प्रणालियों के लिए कार्यान्वयन किए गए हैं, हालांकि वे कभी लोकप्रिय नहीं हुए हैं।

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