2012-04-10 12 views
6

मैं समझता हूं कि क्लास ऑब्जेक्ट क्लास हाइर्चरी के शीर्ष पर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंगेज में जावा की तरह है। मैं यह भी समझता हूं कि आपके पास .NET में संदर्भ प्रकार और मान प्रकार हैं। मैं सी आधारित भाषाओं में टाइप परिभाषाओं को भी समझता हूं।वीबी 6 ऑब्जेक्ट और डेटा प्रकार

इसके बावजूद; मैं यह समझने के लिए संघर्ष कर रहा हूं कि ऑब्जेक्ट वीबी 6 ( http://msdn.microsoft.com/en-us/library/aa338034%28v=vs.60%29.aspx ) में क्या है और वास्तव में एक संस्करण क्या है। एक संस्करण क्या है? और वीबी 6 में एक वस्तु कैसे कार्यान्वित की जाती है?

+0

एक वीबी 6 संस्करण में http://msdn.microsoft.com/en-us/library/aa908601.aspx – Bob77

उत्तर

9

वीबी 6 द्वारा उपयोग की जाने वाली सभी ऑब्जेक्ट COM ऑब्जेक्ट्स हैं। एक COM ऑब्जेक्ट अनिवार्य रूप से एक वेरिएबल लम्बाई डेटा संरचना है जिसका परिवर्तनीय लंबाई शीर्षलेख VTables में 32 बिट पॉइंटर्स की संख्या है, और सहायक बाइट्स में ऑब्जेक्ट का इंस्टेंस डेटा होता है। उदाहरण के लिए,

Bytes 
0-3 VTable1 pointer 
4-7 VTable2 pointer 
8-11 VTable3 pointer 
... 
     Instance data 

एक vtable कार्य करता है जो सभी के लिए एक "यह" उदाहरण के सूचक पारित कर रहे हैं करने के लिए 32 बिट संकेत की एक सरणी है।

Bytes 
0-3 Func1(this, ..., ...) 
4-7 Func2(this, ..., ...) 
8-11 Func3(this, ..., ...) 
... 

केवल अन्य विनिर्देश है कि सभी VTables MUST इनहेरिट IUnknown से, अर्थातपहले तीन कार्यों होना चाहिए:

QueryInterface() 
AddRef() 
Release() 

अनिवार्य रूप से, QueryInterface() तुम बाहर एक COM वस्तु एक विशिष्ट इंटरफ़ेस (जो एक UUID का प्रतिनिधित्व करती है) का समर्थन करता है कि क्या पता लगाने के लिए अनुमति देता है। AddRef() ऑब्जेक्ट लेखक को आंतरिक संदर्भ गणना बढ़ाने की अनुमति देता है। रिलीज() ऑब्जेक्ट लेखक को काउंटर शून्य होने पर ऑब्जेक्ट को नष्ट करने, संदर्भ काउंटर को कम करने की अनुमति देता है। आप कभी भी इन तरीकों को वीबी में नहीं बुलाते हैं - संकलक आपके लिए ये कॉल जोड़ता है (वीबी 6 के फायदों में से एक)। अधिक जानकारी के लिए

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680509(v=vs.85).aspx देखें।

एक वीबी 'वस्तु' प्रकार एक संदर्भ एक वस्तु जो IDispatch इंटरफ़ेस (http://msdn.microsoft.com/en-us/library/windows/desktop/dd318520(v=vs.85).aspx देखें) का समर्थन करता है के लिए है। यह आपको वीबी और वीबीस्क्रिप्ट में देर से बाध्यकारी करने की अनुमति देता है। वीबी 6 में लिखे गए सभी ऑब्जेक्ट्स स्वचालित रूप से एक इंटरफेस को कार्यान्वित करते हैं जो आईडीस्पैच से प्राप्त होता है। इसे दोहरी इंटरफ़ेस कहा जाता है, क्योंकि यह प्रारंभिक और देर से बाध्यकारी का समर्थन करता है।

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

बॉब रिमेर्समा द्वारा वर्णित वैरिएंट प्रकार वास्तव में एक 16 बाइट संरचना है जिसमें 2 बाइट पूर्णांक (vt) है जो इंगित करता है कि स्वचालन प्रकार किस प्रकार encapsulated किया जा रहा है, और बाद के 8 बाइट मूल्य प्रकार के लिए इस्तेमाल किया जा सकता है 8 बाइट्स तक, या 32 बिट पॉइंटर दूसरे प्रकार के लिए। वीबी अपने आंतरिक कार्यों का उपयोग करके वीबी प्रकारों और प्रकारों के बीच सभी आवश्यक रूपांतरण करता है, और सभी आवश्यक स्मृति आवंटन और विध्वंस। वेरिएंट में वस्तु को पॉइंटर को वेरिएंट में कॉपी करके और ऑब्जेक्ट की AddRef() विधि को कॉल करके COM ऑब्जेक्ट्स में संदर्भ हो सकते हैं।

+0

यह इस विषय पर एक उत्कृष्ट सटीक है, मार्क। – BobRodes

+0

एकमात्र संभावित रूप से उपयोगी विस्तार मैं देख सकता हूं कि वीबी केवल COM ऑब्जेक्ट्स का समर्थन करता है जो दोहरी इंटरफेस का पर्दाफाश करते हैं, क्योंकि यह उन ऑब्जेक्ट्स के बीच अंतर करने की दुर्भाग्यपूर्ण दुनिया में नहीं जाना चाहता है जो देर से बाध्यकारी का समर्थन नहीं करते हैं। दूसरी तरफ, यह सख्त सीमा नहीं है, क्योंकि यह एक विशेष रूप से प्रारंभिक बाध्य COM कक्षा में इंटरफ़ेस प्राप्त करने के लिए iUnknown प्रकार के चर के साथ SendMessage और EM_GETOLEINTERFACE के उपयोग के माध्यम से संभव है। – BobRodes

5

मुझे अलग मुद्दों में इस टूट करते हैं:

पहले, VB6 VB.Net नहीं है और नेट फ्रेमवर्क का उपयोग नहीं करता, लेकिन इसके बजाय पुराने कॉम फ्रेमवर्क का उपयोग करते। (यह नहीं बता सकता कि क्या आप इसे पहले ही जानते थे)।

दूसरे, क्या आपके लिंक इशारा कर रही है वास्तव में क्लासेस VB6 करने के लिए निर्मित कर रहे हैं। हालांकि, हाँ, यह उन्हें "ऑब्जेक्ट्स" कहते हैं। उनके हिस्से पर स्लोपी शब्दावली।

तीसरा, और शायद सबसे महत्वपूर्ण बात यह है कि वीबी 6 में, सब कुछ एक वस्तु नहीं है, और ऑब्जेक्ट्स डेटा-प्रकार की डिफ़ॉल्ट या प्रभावी श्रेणी भी नहीं हैं। क्या है, नेट के मूल्य-प्रकारों की तरह कुछ है, लेकिन बहुत कम है (अधिकांश में रन-टाइम टाइप-कंटेनर भी नहीं हैं, बस स्मृति में पते)।

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

वेरिएंट इस समस्या का एक पूर्व समाधान थे कि इस समस्या को हल करने के लिए वीबी के पुराने संस्करणों (वीबी में ऑब्जेक्ट्स से पहले) लागू किए गए थे। एक संस्करण केवल एक गतिशील-वर्णनकर्ता है जो के किसी अन्य आइटम को डेटा-प्रकार को लपेटता है। जब आप इसका उपयोग करते हैं तो (आमतौर पर) आपके जैसे कार्य सीधे इसमें शामिल होते हैं, लेकिन आप वास्तव में के माध्यम से वेरिएंट को वर्तमान में होने वाले किसी भी प्रकार के डेटा आइटम को प्राप्त करने के लिए जा रहे हैं।

वैरिएंट स्वयं ही इसकी सामग्री का डेटा-प्रकार क्या ट्रैक करता है इसका ट्रैक रखता है, और वीबी कोड को अलग-अलग/उचित रूप से (बहुमूल्य प्रकार का बहुरूपता) व्यवहार करने के लिए इसका उपयोग करता है।

यदि यह अपनी क्लेडी की तरह लगता है और बहुत अधिक ओवरहेड था, तो यह था। लेकिन उस समय जब आप "किसी डेटा-प्रकार" को संभालने की आवश्यकता होती है तो यह सबसे अच्छा उपलब्ध समाधान था।

+0

पर वर्णित एक संरचना है, मुझे एहसास है कि वीबी 6 एक COM आधारित भाषा है और .NET Framewwork पर आधारित नहीं है। मेरा सवाल विशेष रूप से वेरिएंट के बारे में है। – w0051977

+1

मैं वहां जा रहा हूं ... :) – RBarryYoung