2010-05-14 15 views
5

COM में एक दोहरी इंटरफ़ेस वह है जिसे डिस्पइंटरफेस के माध्यम से या VTable विधियों के माध्यम से एक्सेस किया जा सकता है।COM दोहरी इंटरफेस

अब कोई मुझे बता सकता है कि दो तरीकों के बीच अंतर क्या है?

मैंने सोचा कि एक वीटीबल एक वर्चुअल टेबल है जो क्लास पदानुक्रम को लागू करते समय विभिन्न कार्यों के पॉइंटर्स रखती है जिसमें वर्चुअल फ़ंक्शंस हैं जिन्हें बाल कक्षाओं में ओवरराइड किया जा सकता है। हालांकि मुझे नहीं लगता कि यह COM में दोहरी इंटरफ़ेस से कैसे संबंधित है?

उत्तर

2

संक्षेप में, COM बाइनरी विनिर्देश है, न कि भाषा विनिर्देश। वास्तव में दोहरी इंटरफेस और कोड में कक्षाओं को प्राप्त करने के बीच एक सहसंबंध नहीं है। सेब और संतरे।

वीटीबल "प्रारंभिक बाध्य" है और इसलिए यह तेज़ है। आप संकलित समय पर जिस प्रकार की विधि को बुला रहे हैं उसे जानते हैं।

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

मुझे आशा है कि यह संक्षिप्त स्पष्टीकरण मदद करता है।

+0

'बाइनरी विनिर्देश' के साथ आपका क्या मतलब है? –

+2

@ टोनी: इसका मतलब है कि COM केवल बाइनरी स्तर पर घटक कैसे संचार करता है - यह बताता है कि घटकों को कैसे विकसित किया जाता है या कोड किस भाषा में लिखा जाता है या क्या "वर्ग पदानुक्रम" है। घटक ऑब्जेक्ट मॉडल देखें: एक तकनीकी अवलोकन @ http://msdn.microsoft.com/en-us/library/ms809980।शुरुआती बनाम देर बाध्यकारी के लिए एएसपीएक्स –

+0

+1। –

3

मुख्य अंतर ऑब्जेक्ट विधियों को कॉल करने के तरीके में है। DispInterface कॉल के मामले में IDispatch :: Invoke विधि (स्क्रिप्ट में या इंटरफ़ेस विवरण की अनुपस्थिति में) के माध्यम से जाता है remarks देखें। यह विधि बहुत धीमी दूसरी विकल्प है। दूसरे मामले में विधि कॉल के लिए सीधे VTable का उपयोग किया जाता है (सी + + या नेट भाषाओं से कॉल के लिए उपयोग किया जाता है)

+0

तो आईडीस्पेच पर चालान विधि का उपयोग किसी स्क्रिप्ट जैसे वीबीस्क्रिप्ट या जेस्क्रिप्ट से तरीकों का आह्वान करने के लिए किया जाता है? –

+0

@ टोनी सही - यदि आप COM ऑब्जेक्ट को स्क्रिप्ट से प्रयोग करने योग्य बनाना चाहते हैं तो आपको एक दोहरी इंटरफ़ेस की आवश्यकता होगी। –

+1

हां, जब आप स्क्रिप्ट में हों तो एक विधि कॉल करते हैं, तो पहले यह आईडीिसपैच :: GetIDsOfNames और फिर IDispatch :: Invoke को कॉल करता है – Victor

1

मैं केवल अतिरिक्त टोनी के सवालों का जवाब देना चाहता हूं।

यदि आप एक COM बनाना चाहते हैं जिसे वीबीस्क्रिप्ट/जेस्क्रिप्ट से या पुराने "क्लासिक" एएसपी से एक्सेस किया जा सकता है तो आपको आईडीस्पैच को लागू करना होगा।

विजुअल बेसिक 6 में या एमएस ऑफिस के वीबीए में कोई भी दोनों तरीकों का उपयोग कर सकता है। यदि आप अपने COM में संदर्भ जोड़ते हैं, तो आप "प्रारंभिक बाध्य" (IU अज्ञात या VTable) का उपयोग करेंगे। यदि आप CreateObject ("ProgIdName") के साथ VB6 या VBA में अपने COM का उपयोग करते हैं, तो आप "देर से बाध्य" का उपयोग करेंगे।

यह समझना बहुत महत्वपूर्ण है कि COM को VB6/VBA ect से सुलभ बनाने के लिए। यह केवल अज्ञात इंटरफ़ेस को लागू करने के लिए पर्याप्त नहीं है। आपको oleautomation विशेषता के साथ टाइप लाइब्रेरी बनाना और पंजीकरण करना होगा। ऐसा करने में सक्षम होने के लिए, आप अपने COM के इंटरफ़ेस में केवल oleautomation संगत डेटा प्रकारों का उपयोग कर सकते हैं (http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx देखें)। टाइप लाइब्रेरी को क्लाइंट मार्शलिंग डीएलएल की भूमिका निभाने के लिए, इसलिए यह आपके COM के पैरामीटर के रूप में सही डेटा भेजने के लिए वीबी 6/वीबीए जैसे क्लाइंट सॉफ़्टवेयर की सहायता करता है। आपको यह नहीं भूलना चाहिए कि आपका COM भी एक इंप्रोक सर्वर होगा, एक डीएलएल, पैरामीटर सीधे COM पर नहीं होंगे, लेकिन मार्शल की आवश्यकता होगी। मार्शलिंग के दौरान डेटा की एक प्रति थ्रेड पर बनाई जाएगी जहां आपका COM चलाया जाएगा। यह आपके COM DLL थ्रेड को एक तरफ से सुरक्षित बनाता है और COM COM को वापस करने से पहले आपके COM विधि को कॉल करने वाले थ्रेड को समाप्त होने पर COM क्रैश नहीं होगा।

शायद मार्शलिंग के बारे में मेरी व्याख्या आसान नहीं है, लेकिन यह महत्वपूर्ण है कि टाइप लाइब्रेरी बनाने और पंजीकरण करना न भूलें जो COM के अंदर संसाधन के रूप में सहेजना बेहतर है।

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