COM

2010-03-27 17 views
5

के बारे में न्यूबी प्रश्न मैं COM के लिए काफी नया हूं इसलिए सवाल बेवकूफ लग सकता है।COM

क्यू 1। विंडोज़ डीएलएल

मेरी समझ के आधार पर, एक विंडोज डीएलएल फ़ंक्शन, प्रकार (कक्षाएं) और वैश्विक चर निर्यात कर सकता है। क्या यह समझ ठीक है?

प्रश्न 2। COM

मेरी बेवकूफ समझ यह है कि: एक COM DLL एक मानक विंडोज डीएलएल द्वारा निर्यात किए गए कार्यों और प्रकारों को व्यवस्थित करने के लिए सिर्फ एक नया तार्किक तरीका प्रतीत होता है। एक COM DLL दोनों कार्यों जैसे DllRegisterServer() और DllGetClassObject(), और भी क्लासेस जो IUnknown इंटरफ़ेस लागू करता है निर्यात करता है। क्या यह समझ ठीक है?

क्यू 3। * .def & * .idl

* .def ऐसे DllGetClassObject() के रूप में कार्य परंपरागत तरीके से एक Windows DLL द्वारा निर्यात, परिभाषित करने के लिए प्रयोग किया जाता है। * .idl का उपयोग COM कोक्लास द्वारा कार्यान्वित इंटरफ़ेस को परिभाषित करने के लिए किया जाता है।

अग्रिम धन्यवाद।

उत्तर

14

डीएलएल सीमाओं में इंटरफेस साझा करने के लिए एक बाइनरी संगत तरीके के रूप में COM के बारे में सोचें। विभिन्न संकलक संस्करणों के बीच गैर-मानक नाम मैंगलिंग की वजह से सी ++ कक्षाओं को आसानी से डीएलएल से निर्यात नहीं किया जा सकता है। COM एक डीएलएल या निष्पादन योग्य में कोड को किसी अन्य डीएलएल या EXE से इंटरफ़ेस के कार्यान्वयन के लिए अनुमति देता है जब तक कि कार्यान्वयन एक परिभाषित इंटरफ़ेस और कॉलिंग सम्मेलन का पालन करता है। यह वही है जो एक COM कक्षा को सी # में लिखा जा सकता है और सी ++, पायथन, और कई अन्य COM- जागरूक भाषाओं से लिया जाता है।

COM इंटरफेस केवल मानक सी ++ कक्षाएं हैं जिनमें सभी शुद्ध वर्चुअल फ़ंक्शंस हैं और IU अज्ञात से व्युत्पन्न हैं। IU अज्ञात एक पूर्व परिभाषित इंटरफ़ेस है कि सभी अनुपालन COM इंटरफेस से प्राप्त होना चाहिए जो सामान्य गणना जैसे संदर्भ गणना और यह पूछने की क्षमता प्रदान करता है कि कोई ऑब्जेक्ट किसी विशेष इंटरफ़ेस को लागू करता है या नहीं।

DLLs कि 4 कार्यों के निर्यात से तथ्य यह है कि वे बना सकते हैं COM इंटरफ़ेस के कार्यान्वयन ऐसा विज्ञापन करना चाहते हैं:

  • DllGetClassObject => एक अनुरोध किया इंटरफ़ेस
  • DllCanUnloadNow => सभी चाहे के एक वर्ग के कारखाने लौटें उदाहरणों सौंप दिया के बाद से जारी किया गया है
  • DllRegisterServer => रजिस्टर प्रकार इस DLL अपंजीकृत रजिस्ट्री
  • DllUnregisterServer => में इस DLL आपूर्ति और रजिस्ट्री
  • से उसके प्रकार

    Q1:

तो आपके सवालों के जवाब। विंडोज डीएलएल के बारे में मेरी समझ के आधार पर, एक विंडोज डीएलएल फ़ंक्शन, प्रकार (कक्षाएं) और वैश्विक चर निर्यात कर सकता है। क्या यह समझ ठीक है?

DLLs कार्य करता है और कक्षाएं निर्यात कर सकते हैं (यकीन है कि वैश्विक चर के बारे में नहीं, लेकिन आप उन्हें यदि आप कर सकते हैं यहां तक ​​कि DLLs निर्यात किया जा नहीं करना चाहते हैं! :-)) हालांकि, निर्यात कक्षाएं घायल नाम दिया जाएगा और इसलिए केवल अन्य डीएलएल या EXEs द्वारा प्रयोग योग्य है जो समान नाम के समान होते हैं (व्यवसाय करने का एक अच्छा तरीका नहीं)। सी-स्टाइल कॉलिंग सम्मेलन के साथ कार्य का नाम उलझन में नहीं है और इसलिए इसे बिना किसी समस्या के निर्यात और अन्य जगहों से बुलाया जा सकता है।

प्रश्न 2। एक COM DLL दोनों कार्यों जैसे DllRegisterServer() और DllGetClassObject(), और क्लास जो IU अज्ञात इंटरफ़ेस लागू करता है, दोनों निर्यात करता है। क्या यह सब सही है?

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

COM एक बड़ा और जटिल जानवर है, लेकिन इसकी नींव काफी सरल है। आप कुछ और जानकारी के लिए इस लिंक को COM Intro भी देख सकते हैं। सौभाग्य!

+0

+1 COM वह पागल नहीं है। यह आपको निम्न-स्तरीय अंतर में उच्च-स्तरीय भाषाओं को पुल करने में सक्षम बनाता है। – pestilence669

4

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

कॉम के बारे में अन्य उपयोगी तथ्य:

  • सहायक काम करता है, ज्यादातर उपसर्ग Co साथ नामित किया गया का एक छोटा लेकिन जटिल पुस्तकालय नहीं है। ये वे हैं जो वास्तव में डीएलएल लोड करते हैं, निर्यात किए गए कार्यों का पता लगाते हैं और उन्हें कॉल करते हैं। क्लाइंट कोड सामान्य रूप से सीधे डीएलएल निर्यात को कॉल नहीं करेगा (हालांकि यह सरल इन-प्रोसेस COM ऑब्जेक्ट्स के लिए अपनी होस्टिंग सिस्टम लिखने के लिए काफी सरल मामला है)।
  • एक महत्वपूर्ण इंटरफ़ेस IDispatch है जो अबास्ट्रक्शन की एक और परत जोड़ता है, ताकि विधि को खोजने और तर्क मानों की सरणी पारित करने के लिए स्ट्रिंग का उपयोग करके ऑब्जेक्ट पर कॉल करने के तरीकों को गतिशील रूप से पहचानना संभव हो। यह स्क्रिप्टिंग भाषाओं को COM ऑब्जेक्ट को सुरक्षित रूप से कॉल करने की अनुमति देता है (यानी एक ऐसे तरीके से जो प्रोग्रामर द्वारा क्रैश होने की बजाय गलतियों को सहन करता है)।
  • अन्य धागे, अन्य प्रक्रियाओं या यहां तक ​​कि अन्य कंप्यूटरों से ऑब्जेक्ट्स को कॉल करने की इजाजत देने के लिए एक और जटिल "मार्शलिंग" प्रणाली है; फॉर्म के लिए अपने रिमोट (और सुरक्षा-जागरूक) में इसे डीसीओएम कहा जाता था। यह उस पैमाने पर कुछ भी सफल नहीं हुआ जिसने अन्य COM उपयोग किए थे।
  • क्रॉस-प्रोसेस समर्थन ओएलई 2 का आधार था, जो कि 1 99 0 के दशक के शुरू में हर एप्लिकेशन को समर्थन देने के लिए पहुंचा था, उनमें से अधिकतर (बहुत ही जटिल) इंटरफेस को गलत तरीके से कार्यान्वित करते हैं और पूरे स्थान पर दुर्घटनाग्रस्त हो जाते हैं।
  • ओएलई नियंत्रण बहुत अधिक सफल थे, जो तकनीकी रूप से बहुत सरल थे (मार्शलिंग का उपयोग नहीं करते) और जिसने विजुअल बेसिक को बढ़ाने का एक तरीका प्रदान किया।
  • कम से कम एक व्यापक रूप से वितरित COM-प्रेरित सिस्टम है जो COM के साथ संगत नहीं है लेकिन बिल्कुल वही अवधारणाओं (कम से कम साधारण सामान) साझा करता है, जिसे XPCOM कहा जाता है और यह मोज़िला फ़ायरफ़ॉक्स वेब ब्राउज़र का आधार है।
  • यदि आप व्यापक रूप से COM का उपयोग करते हैं, तो आपके पास .NET ढांचे के साथ एकीकृत करने का एक शानदार तरीका होगा, क्योंकि इसमें COM के साथ शानदार इंटरऑपरेबिलिटी शामिल है। लेकिन आपको COM के नियमों का पालन करना चाहिए: AddRef/Release को बिल्कुल परिभाषित किया जाना चाहिए, इसलिए किसी ऑब्जेक्ट को कभी भी नष्ट नहीं किया जाना चाहिए, जबकि इसकी संदर्भ संख्या शून्य से अधिक है, QueryInterface का उपयोग करना संभव है ताकि IUnknown किसी इंटरफ़ेस से, और मूल इंटरफ़ेस पर वापस जाने के लिए, किसी भी इंटरफ़ेस से प्राप्त IUnknown ऑब्जेक्ट के जीवनकाल के लिए हमेशा एक ही स्मृति पता होना चाहिए (इसलिए इसे पहचान तुलना के लिए उपयोग किया जा सकता है)। तो उदाहरण के लिए: स्टैक पर COM ऑब्जेक्ट्स न बनाएं, और अलग-अलग ऑब्जेक्ट्स को QueryInterface से वापस न करें (यानी, ऑब्जेक्ट्स जिनके पास QueryInterface है जो विभिन्न इंटरफेस देता है)।
  • COM के साथ एक प्रमुख गोचा यह है कि इसमें स्ट्रिंग का प्रतिनिधित्व करने के कम से कम दो मानक तरीके हैं। न तो संदर्भ गिनती का उपयोग करता है। उन्होंने कभी भी IString इंटरफेस को परिभाषित क्यों नहीं किया है, लेकिन उन्होंने नहीं किया।
  • यदि आप स्मार्ट पॉइंटर्स को संदर्भ रखने के लिए COM कोड लिखने का प्रयास करते हैं, या बेस क्लास के बिना इंटरफेस को लागू करने में आपकी सहायता के लिए आप पागल हो जाएंगे, उदा। class MyClass : COM::Object<IThis, IThat> {...)
5

cpalmer के अच्छा जवाब देने के लिए पर जोड़ने के लिए, वहाँ कोई विशेष कारण है कि आप रजिस्ट्री उपयोग करने की आवश्यकता है और चार की सिफारिश कार्यों अपने DLL से COM निर्यात करने के लिए है।

आप एक रजिस्ट्री मुक्त कॉम, या COM-लाइट दृष्टिकोण, इस्तेमाल कर सकते हैं जहां आप बस जैसे

__declspec (dllexport) शून्य MyDllCreateFoo (IFoo ** ppFoo) निर्यात कारखाने के तरीकों,;

डीएलएल उपयोगकर्ता आपके कारखाने को अपनी कक्षा सीएमएफयू बनाने के लिए बुलाएंगे जो IFoo लागू करता है। क्या DllRegister सर्वर एट। अल। सीएमईएफयू और अन्य वर्गों को रजिस्ट्री में अन्य चीज़ों के साथ देखने की अनुमति है।

प्रश्न 3: यदि आप भावना में नहीं हैं तो आप वास्तव में सही हैं। .def फ़ाइलें और .idl फ़ाइलें बहुत अलग जानवर हैं। .def फ़ाइलें केवल लिंकर द्वारा उपयोग किया जाता है, और भी आवश्यक नहीं हैं - आप सभी कार्यों आप __declspec (dllexport) शून्य foo() {}

का उपयोग कर चाहते हैं कि आपके सी ++ कोड के अंदर निर्यात कर सकते हैं।

.idl फ़ाइलों का उपयोग C++ शीर्षलेख (.h फ़ाइलें) उत्पन्न करने के लिए किया जाता है जो डीएलएल और उसके ग्राहकों दोनों के साथ शामिल होते हैं। यह इंटरफेस और कुछ गोंद कोड उत्पन्न करता है जो पैरामीटर मैशलिंग जैसी चीजें करता है।

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

कारण मैं इसे टूट कर रहा हूँ की तरह यह है कि कॉम वर्णन करने के लिए है एक बड़ा अखंड बात नहीं है, बल्कि इसके चारों ओर निर्मित सामान का एक समूह के साथ एक बहुत छोटी बात आप या नहीं का उपयोग करने का विकल्प चुन सकता है, , चखना।

+0

बहुत बहुत धन्यवाद, ड्रू। हां, यह वही है जो मैं फैक्ट्री विधि को सीधे निर्यात करने के बारे में सोच रहा हूं। क्योंकि मुझे लगता है कि यह एक DllGetClassObject() विधि निर्यात करने के लिए बस थकाऊ है। मुझे एहसास नहीं हुआ कि यह पहले से ही है और इसे उत्तर देने तक reg-free COM कहा जाता है, धन्यवाद। – smwikipedia

+0

खेद है कि मैं केवल 1 उत्तर को उत्तर के रूप में चिह्नित कर सकता हूं। – smwikipedia