घटक वस्तु मॉडल

From Vigyanwiki

COM
Component Object Model
AbbreviationCOM
StatusIn force
First published1993; 31 years ago (1993)
Latest versionLiving standard
2021
OrganizationMicrosoft
SeriesSystem Services
Base standardsMIDL, UUID
Related standards
DomainComponent Interfacing
Websitedocs.microsoft.com/en-us/windows/win32/com/the-component-object-model

कंपोनेंट ऑब्जेक्ट मॉडल (सीओएम) एक एप्लिकेशन बाइनरी अंतरापृष्ठ है। 1993 में माइक्रोसॉफ्ट द्वारा प्रस्तुत किए गए घटक-आधारित सॉफ़्टवेयर इंजीनियरिंग के लिए बाइनरी-अंतरापृष्ठ मानक इसका उपयोग प्रोग्रामिंग भाषाओं की एक बड़ी रेंज में अंतःप्रक्रम संचार वस्तु (कंप्यूटर विज्ञान) के निर्माण को सक्षम करने के लिए किया जाता है। सीओएम कई अन्य माइक्रोसॉफ्ट तकनीकों और फ्रेमवर्क का आधार है, जिसमें ओएलई, ओएलई ऑटोमेशन, ब्राउज़र हेल्पर ऑब्जेक्ट, एक्टिव एक्स, सीओएम+, डीसीओएम+, वितरित घटक वस्तु मॉडल, विंडोज़ शेल, डायरेक्ट एक्स, यूएमडीएफ और विंडोज़ रनटाइम सम्मिलित हैं। सीओएम का सार वस्तुओं को लागू करने का एक भाषा-तटस्थ तरीका है जिसका उपयोग उन वातावरणों से भिन्न वातावरण में किया जा सकता है जिनमें वे बनाए गए थे, यहां तक ​​कि मशीन की सीमाओं के पार भी इसका उपयोग किया जा सकता है। अच्छी तरह से लिखे गए घटकों के लिए, सीओएम उन वस्तुओं के पुन: उपयोग की अनुमति देता है जिनके आंतरिक कार्यान्वयन का कोई ज्ञान नहीं है, क्योंकि यह घटक कार्यान्वयनकर्ताओं को अच्छी तरह से परिभाषित अंतरापृष्ठ (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) प्रदान करने के लिए विवश करता है जो कार्यान्वयन से अलग होते हैं। भाषाओं के विभिन्न आवंटन शब्दार्थों को सन्दर्भ गणना के माध्यम से वस्तुओं को उनके स्वयं के निर्माण और विनाश के लिए उत्तरदायी बनाकर समायोजित किया जाता है। किसी वस्तु के विभिन्न अंतरापृष्ठ के बीच प्रकार रूपांतरण किसके माध्यम से प्राप्त किया जाता है QueryIएनटीerface तरीका सीओएम के भीतर वंशानुक्रम की पसंदीदा विधि उप-ऑब्जेक्ट्स का निर्माण है, जिसके लिए विधि कॉल प्रत्यायोजित की जाती हैं।

सीओएम एक अंतरापृष्ठ तकनीक है जिसे केवल माइक्रोसॉफ्ट विंडोज़ और एप्पल के कोर फाउंडेशन 1.3 और बाद में प्लग-इन अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) पर मानक के रूप में परिभाषित और कार्यान्वित किया गया है।[1] उत्तरार्द्ध केवल पूरे सीओएम अंतरापृष्ठ का सबसेट लागू करता है।[2] कुछ अनुप्रयोगों के लिए, सीओएम को कम से कम कुछ हद तक .नेट फ़्रेमवर्क, माइक्रोसॉफ्ट .नेट फ़्रेमवर्क, और विंडोज़ संचार फ़ाउंडेशन (डब्ल्यूसीएफ) के माध्यम से वेब सेवाओं के लिए समर्थन द्वारा प्रतिस्थापित किया गया है। हालांकि, .नेट सीओएम इंटरऑप के माध्यम से सीओएम ऑब्जेक्ट्स का उपयोग सभी .नेट भाषाओं के साथ किया जा सकता है। नेटवर्क्ड डीसीओएम बाइनरी उत्तरदायी प्रारूप का उपयोग करता है, जबकि डब्ल्यूसीएफ एक्सएमएल- आधारित एसओएपी (प्रोटोकॉल) मैसेजिंग के उपयोग को प्रोत्साहित करता है। सीओएम अन्य घटक सॉफ़्टवेयर अंतरापृष्ठ तकनीकों के समान है, जैसे कोबरा और एंटरप्राइज जावाबीन्स, हालांकि प्रत्येक की अपनी ताकत और कमजोरियां हैं। C++ के विपरीत, सीओएम एक स्थिर अनुप्रयोग बाइनरी अंतरापृष्ठ (एबीआई) प्रदान करता है जो कंपाइलर रिलीज़ के बीच नहीं बदलता है।[3] यह सीओएम अंतरापृष्ठ को ऑब्जेक्ट-ओरिएंटेड सीC++ लाइब्रेरी के लिए आकर्षक बनाता है, जिनका उपयोग ग्राहकों द्वारा विभिन्न कंपाइलर संस्करणों का उपयोग करके संकलित किया जाता है।

इतिहास

विंडोज़ में इंटरप्रोसेस संचार के पहले तरीकों में से एक डायनेमिक डेटा स्थानांतरण (डीडीई) था,[4] जिसे पहली बार 1987 में प्रस्तुत किया गया,[5] जो अनुप्रयोगों के बीच तथाकथित कम्युनिकेशनों में संदेश भेजने और प्राप्त करने की अनुमति देता है। एंटनी विलियम्स (प्रौद्योगिकीविद्), जो सीओएम आर्किटेक्चर के निर्माण में सम्मिलित थे, ने बाद में माइक्रोसॉफ्ट में दो आंतरिक पेपर वितरित किए जिन्होंने सॉफ्टवेयर घटकों की अवधारणा को अपनाया: ऑब्जेक्ट आर्किटेक्चर: डीलिंग विथ द अननोन - या - टाइप सेफ्टी इन ए डायनेमिकली एक्सटेंसिबल क्लास लाइब्रेरी 1988 में और इनहेरिटेंस: व्हाट इट मीन्स एंड हाउ टू यूज़ इट इन 1990 में इसने सीओएम के पीछे कई विचारों की नींव प्रदान की। ऑब्जेक्ट लिंकिंग एंड एंबेडिंग (ओएलई), माइक्रोसॉफ्ट का पहला ऑब्जेक्ट-आधारित फ्रेमवर्क, डीडीई के शीर्ष पर बनाया गया था और विशेष रूप से मिश्रित डॉक्यूमेंटों के लिए डिज़ाइन किया गया था। इसे 1991 में विंडोज और माइक्रोसॉफ्ट एक्सेल के लिए वर्ड के साथ प्रस्तुत किया गया था, और बाद में 1992 में वर्जन 3.1 के साथ प्रारम्भ करते हुए विंडोज के साथ सम्मिलित किया गया था। कंपाउंड डॉक्यूमेंट का एक उदाहरण विंडोज डॉक्यूमेंट के लिए वर्ड में एम्बेडेड स्प्रेडशीट है: जैसा कि इसमें बदलाव किए जाते हैं। एक्सेल में स्प्रेडशीट, वे स्वचालित रूप से वर्ड डॉक्यूमेंट के अंदर दिखाई देते हैं।

1991 में, माइक्रोसॉफ्ट ने विज़ुअल बेसिक एक्सटेंशन (वीबीएक्सX) को विज़ुअल बेसिक 1.0 के साथ प्रस्तुत किया। एक वीबीएक्स एक डायनेमिक-लिंक लाइब्रेरी (डीएलएल) के रूप में एक पैकेज्ड एक्सटेंशन है जो वस्तुओं को ग्राफिक रूप से एक रूप में रखने और गुणधर्म (प्रोग्रामिंग) और विधि (कंप्यूटर विज्ञान) द्वारा हेरफेर करने की अनुमति देता है। इन्हें बाद में अन्य भाषाओं जैसे विजुअल सी ++ ++ द्वारा उपयोग के लिए अनुकूलित किया गया था। 1992 में, जब विंडोज़ का विंडोज़ 3.1x संस्करण जारी किया गया था, तो माइक्रोसॉफ्ट ने इसके अंतर्निहित वस्तु मॉडल के साथ ओएलई 2 जारी किया। सीओएम एप्लिकेशन बाइनरी अंतरापृष्ठ (एबीआई) एमएपीआई एबीआई (1992 में जारी) के समान था, और जैसे यह एमएसआरपीसी पर आधारित था और अंततः खुला समूह के डीसीई/आरपीसी पर आधारित था। जबकि ओएलई 1 यौगिक डॉक्यूमेंट पर केंद्रित था, सीओएम और ओएलई 2 को सामान्य रूप से सॉफ़्टवेयर घटकों को संबोधित करने के लिए डिज़ाइन किया गया था। टेक्स्ट कम्युनिकेशन और विंडोज संदेश एक मजबूत और एक्स्टेंसिबल तरीके से एप्लिकेशन सुविधाओं को साझा करने की अनुमति देने के लिए पर्याप्त लचीले प्रमाणित नहीं हुए थे, इसलिए सीओएम को एक नई नींव के रूप में बनाया गया था, और ओएलई को ओएलई2 में बदल दिया गया था। 1994 में ओएलई कस्टम नियंत्रण (ओसीएक्स) को वीबीएक्सX नियंत्रणों के उत्तराधिकारी के रूप में प्रस्तुत किया गया था। उसी समय, माइक्रोसॉफ्ट ने कहा कि ओएलई 2 को केवल ओएलई के रूप में जाना जाएगा, और यह कि ओएलई अब एक संक्षिप्त नाम नहीं था, बल्कि कंपनी की सभी घटक तकनीकों के लिए एक नाम था। 1996 के प्रारम्भ में, माइक्रोसॉफ्ट ने ओएलई कस्टम नियंत्रणों के लिए एक नया उपयोग पाया, सामग्री को प्रस्तुत करने के लिए अपने वेब ब्राउज़र की क्षमता का विस्तार करते हुए, इंटरनेट एक्टिव एक्स से संबंधित ओएलई के कुछ हिस्सों का नाम बदल दिया, और धीरे-धीरे सभी ओएलई तकनीकों का नाम बदलकर एक्टिव एक्स कर दिया, यौगिक डॉक्यूमेंट तकनीक को छोड़कर माइक्रोसॉफ्ट ऑफिस में उपयोग किया जाता है। उस वर्ष बाद में, माइक्रोसॉफ्ट ने वितरित घटक ऑब्जेक्ट मॉडल के साथ पूरे नेटवर्क में काम करने के लिए सीओएम का विस्तार किया।[6]


संबंधित प्रौद्योगिकियां

सीओएम विंडोज के लिए प्रमुख सॉफ्टवेयर डेवलपमेंट प्लेटफॉर्म था और इस तरह, कई सहायक तकनीकों के विकास को प्रभावित किया। यह वैसे ही पहले की तकनीकों से काफी प्रभावित था।

डीडीई

सीओएम ने डायनेमिक डेटा स्थानांतरण को इंटरप्रोसेस संचार के पसंदीदा रूप में बदल दिया।

डीसीई/आरपीसी और एमएसआरपीसी

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

वितरित घटक वस्तु मॉडल

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

कॉम+

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

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

नेट

माइक्रोसॉफ्ट .नेट घटक प्रौद्योगिकी प्रदान करने और सीओएम+ (सीओएम-इंटरॉप-असेंबली के माध्यम से) के साथ पारस्परिक क्रिया करने के लिए साधन प्रदान करता है; .नेट सामान्यतः उपयोग किए जाने वाले अधिकांश सीओएम नियंत्रणों को रैपर प्रदान करता है। माइक्रोसॉफ्ट .नेट घटक निर्माण से अधिकांश विवरण छुपाता है और इसलिए विकास को आसान बनाता है। .नेट, सिस्टम.एंटरप्राइज़सर्विसेज नामस्थान के माध्यम से सीओएम+ का लाभ उठा सकता है, और सीओएम+ द्वारा प्रदान की जाने वाली कई सेवाओं को .नेट की हाल की रिलीज़ में डुप्लिकेट किया गया है। उदाहरण के लिए, .नेट में सिस्टम.ट्रांज़ैक्शन नेमस्पेस ट्रांज़ैक्शनकोप वर्ग प्रदान करता है, जो सीओएम+ का सहारा लिए बिना लेनदेन प्रबंधन प्रदान करता है। इसी तरह, कतार (डेटा संरचना) को विंडोज कम्युनिकेशन फाउंडेशन द्वारा एमएसएमक्यू ट्रांसपोर्ट के साथ बदला जा सकता है। (एमएसएमक्यू एक देशी सीओएम घटक है, हालांकि) पिछड़े संगतता के लिए सीमित समर्थन है। रनटाइम कॉल करने योग्य रैपर (आरसीडब्ल्यू) को लागू करके .नेट में सीओएम ऑब्जेक्ट का उपयोग किया जा सकता है।[7] नेट ऑब्जेक्ट्स जो कुछ अंतरापृष्ठ प्रतिबंधों के अनुरूप होते हैं, सीओएम ऑब्जेक्ट में सीओएम कॉल करने योग्य रैपर (सीसीडब्ल्यू) को कॉल करके उपयोग किए जा सकते हैं।[8] सीओएम और .नेट दोनों पक्षों से, अन्य तकनीक का उपयोग करने वाली वस्तुएँ मूल वस्तुओं के रूप में दिखाई देती हैं। कॉम इंटरऑप देखें।

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

विंडोज रनटाइम

माइक्रोसॉफ्ट का विंडोज रनटाइम (या विनआरटी, विंडोज आरटी के साथ भ्रमित नहीं होना) प्रोग्रामिंग और एप्लिकेशन मॉडल अनिवार्य रूप से एक कॉम-आधारित एपीआई है, हालांकि यह एक उन्नत कॉम पर निर्भर करता है। इसके सीओएम जैसे आधार के कारण, विंडोज़ रनटाइम कई भाषाओं से अपेक्षाकृत आसान अंतरापृष्ठिंग की अनुमति देता है, जैसा कि सीओएम करता है, लेकिन यह अनिवार्य रूप से एक अप्रबंधित, देशी एपीआई है। हालाँकि, एपीआई परिभाषाएँ .winmd फ़ाइलों में संग्रहीत हैं, जो ECMA 335 मेटाडेटा प्रारूप में एन्कोडेड हैं, वही मेटाडेटा (सीएलआई)CLI) प्रारूप जो .नेट कुछ संशोधनों के साथ उपयोग करता है। जब WinRT को .नेट अनुप्रयोगों से मंगाया जाता है, तो यह सामान्य मेटाडेटा प्रारूप P/Invoke की तुलना में काफी कम ओवरहेड की अनुमति देता है, और इसका सिंटैक्स बहुत सरल है।

नैनो-कॉम (उर्फ XPसीओएम)

नैनो-कॉम कंपोनेंट ऑब्जेक्ट मॉडल का एक बहुत छोटा उपसमुच्चय है जो विशेष रूप से कॉम के एप्लिकेशन बाइनरी अंतरापृष्ठ (एबीआई) पहलुओं पर केंद्रित है जो स्वतंत्र रूप से संकलित मॉड्यूल/घटकों में फ़ंक्शन और विधि कॉल को सक्षम करता है। नैनो-कॉम को एक सी++ हेडर फ़ाइल में आसानी से व्यक्त किया जा सकता है जो सभी सी++ कंपाइलरों के लिए पोर्टेबल है। नैनो-कॉम टाइप किए गए ऑब्जेक्ट संदर्भों के लिए समर्थन जोड़ने के लिए अंतर्निहित निर्देश आर्किटेक्चर और ओएस के मूल एबीआई को बढ़ाता है (सामान्य एबीआई केवल परमाणु प्रकार, संरचनाओं, सरणियों और फ़ंक्शन कॉलिंग सम्मेलनों पर ध्यान केंद्रित करता है)। नैनो-कॉम के आधार का उपयोग Mozilla द्वारा Firefox (XPसीओएम कहा जाता है) को बूटस्ट्रैप करने के लिए किया गया था, और वर्तमान में डायरेक्टX/डायरेक्ट3D/डायरेक्टML के लिए आधार एबीआई तकनीक के रूप में उपयोग में है।

एक नैनो-कॉम हेडर फ़ाइल कम से कम तीन प्रकारों को परिभाषित या नाम देती है:

  • अंतरापृष्ठ प्रकारों की पहचान करने के लिए GUID - यह प्रभावी रूप से 128 बिट संख्या है
  • विधि कॉल से त्रुटि कोड की पहचान करने के लिए HRESULT - यह प्रभावी रूप से 32-बिट iएनटीs के प्रसिद्ध मानों (S_OK, E_FAIL, E_OUTOFMEMORY, आदि) का मानकीकृत उपयोग है।
  • Iसभी टाइप किए गए ऑब्जेक्ट संदर्भों के लिए आधार प्रकार के रूप में अज्ञात - यह समर्थन करने के लिए प्रभावी रूप से सार वर्चुअल फ़ंक्शंस है dynamic_cast<T>नए अंतरापृष्ठ प्रकारों का -स्टाइल अधिग्रहण और एक ला की गिनती करना shared_ptr<T>

नैनो-कॉम के कई उपयोग परिणाम के रूप में कैली-आवंटित मेमोरी बफ़र्स को संबोधित करने के लिए दो कार्यों को भी परिभाषित करते हैं

  • <Nanoसीओएम>Alloc - कॉल करने वाले को लौटाए जाने वाले कच्चे बफर (ऑब्जेक्ट नहीं) आवंटित करने के लिए विधि कार्यान्वयन द्वारा बुलाया जाता है
  • <Nanoसीओएम>निःशुल्क - विधि कॉल करने वालों द्वारा कैली-आवंटित बफ़र्स को एक बार उपयोग में नहीं होने पर मुक्त करने के लिए कॉल किया जाता है

नैनो-कॉम के कुछ कार्यान्वयन जैसे कि डायरेक्ट 3 डी एलोकेटर फ़ंक्शंस से बचते हैं और केवल कॉलर-आवंटित बफ़र्स का उपयोग करने के लिए खुद को प्रतिबंधित करते हैं।

नैनो-कॉम में कक्षाओं, अपार्टमेंट्स, मार्शलिंग, पंजीकरण आदि की कोई धारणा नहीं है। बल्कि, वस्तु संदर्भों को केवल कार्य सीमाओं के पार भेज दिया जाता है और मानक भाषा निर्माण (जैसे, C++ नया ऑपरेटर) के माध्यम से आवंटित किया जाता है।

सुरक्षा

सीओएम और एक्टिव एक्स घटकों को बिना किसी सैंडबॉक्सिंग के उपयोगकर्ता की मशीन पर देशी कोड के रूप में चलाया जाता है। इसलिए कोड क्या कर सकता है, इस पर कुछ प्रतिबंध हैं। इंटरनेट एक्सप्लोरर के साथ वेब पेजों पर एक्टिव एक्स घटकों को एम्बेड करने के पूर्व अभ्यास ने मैलवेयर संक्रमणों के साथ समस्याओं को जन्म दिया। माइक्रोसॉफ्ट ने एक्टिव एक्स के साथ समस्या को 1996 में ही पहचान लिया था जब चार्ल्स फिट्जगेराल्ड ने कहा था, हमने कभी भी यह दावा नहीं किया कि एक्टिव एक्स आंतरिक रूप से सुरक्षित है।[9] हाल ही का[when?] Iएनटीerनेट Explorer के संस्करण एक्टिव एक्स नियंत्रणों को स्थापित करने से पहले उपयोगकर्ता को संकेत देते हैं, उपयोगकर्ता को उन साइटों से नियंत्रणों की स्थापना को अस्वीकार करने में सक्षम बनाता है जिन पर उपयोगकर्ता भरोसा नहीं करता है। एक्टिव एक्स नियंत्रण उनकी प्रामाणिकता की गारंटी के लिए डिजिटल हस्ताक्षर के साथ कोड हस्ताक्षर कर रहे हैं। एक्टिव एक्स नियंत्रणों को पूरी तरह से अक्षम करना या केवल कुछ चुनिंदा को अनुमति देना भी संभव है। आउट-ऑफ-प्रोसेस सीओएम सर्वरों के लिए पारदर्शी समर्थन अभी भी प्रक्रिया अलगाव के संदर्भ में सॉफ़्टवेयर सुरक्षा को बढ़ावा देता है। यह बड़े अनुप्रयोग के सबसिस्टम को अलग-अलग प्रक्रियाओं में अलग करने के लिए उपयोगी हो सकता है। प्रक्रिया अलगाव एक प्रक्रिया में राज्य के भ्रष्टाचार को अन्य प्रक्रियाओं की अखंडता को नकारात्मक रूप से प्रभावित करने से रोकता है, क्योंकि वे केवल कड़ाई से परिभाषित अंतरापृष्ठ के माध्यम से संचार करते हैं। इस प्रकार, वैध स्थिति को पुनः प्राप्त करने के लिए केवल प्रभावित सबसिस्टम को पुनः आरंभ करने की आवश्यकता है। यह एक ही प्रक्रिया के भीतर सबसिस्टम के मामले में नहीं है, जहां एक सबसिस्टम में एक दुष्ट सूचक अन्य सबसिस्टम को बेतरतीब ढंग से दूषित कर सकता है।

तकनीकी विवरण

सीओएम प्रोग्रामर सीओएम-जागरूक सॉफ़्टवेयर घटकों का उपयोग करके अपने सॉफ़्टवेयर का निर्माण करते हैं। क्लास आईडी (CLSIDs) द्वारा विभिन्न घटक प्रकारों की पहचान की जाती है, जो वैश्विक रूप से विशिष्ट पहचानकर्ता (GUIDs) हैं। प्रत्येक सीओएम घटक एक या अधिक अंतरापृष्ठ (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) के माध्यम से अपनी कार्यक्षमता को उजागर करता है। एक घटक द्वारा समर्थित विभिन्न अंतरापृष्ठ अंतरापृष्ठ आईडी (आईआईडी) का उपयोग करके एक दूसरे से अलग होते हैं, जो कि GUID भी हैं। सीओएम अंतरापृष्ठ में कई भाषाओं में भाषा बंधन होती है, जैसे C (प्रोग्रामिंग लैंग्वेज), C++, विजुअल बेसिक, डेल्फी (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग लैंग्वेज)।[10][11] और कई स्क्रिप्टिंग भाषाओं को विंडोज प्लेटफॉर्म पर लागू किया गया। घटकों तक सभी पहुंच अंतरापृष्ठ की विधि (कंप्यूटर विज्ञान) के माध्यम से की जाती है। यह इंटर-प्रोसेस, या यहां तक ​​कि इंटर-कंप्यूटर प्रोग्रामिंग (डीसीओएम के समर्थन का उपयोग करने वाला बाद वाला) जैसी तकनीकों की अनुमति देता है।

अंतरापृष्ठ

सभी सीओएम घटक अज्ञात (कस्टम) अंतरापृष्ठ को लागू करते हैं, जो संदर्भ गणना और प्रकार रूपांतरण (कास्टिंग) के तरीकों को उजागर करता है। एक कस्टम I अज्ञात अंतरापृष्ठ में एक वर्चुअल विधि तालिका के लिए एक सूचक होता है जिसमें उन कार्यों के लिए पॉइंटर्स की एक सूची होती है जो अंतरापृष्ठ में घोषित कार्यों को लागू करते हैं, उसी क्रम में वे अंतरापृष्ठ में घोषित किए जाते हैं। इन-प्रोसेस इनवोकेशन ओवरहेड इसलिए C ++ में आभासी विधि तालिका के बराबर है। कस्टम अंतरापृष्ठ के अलावा, सीओएम IDISpatch से इनहेरिट करने वाले डिस्पैच अंतरापृष्ठ का भी समर्थन करता है। डिस्पैच अंतरापृष्ठ ओएलई ऑटोमेशन के लिए लेट बाइंडिंग का समर्थन करता है। यह डिस्पैच अंतरापृष्ठ को कस्टम अंतरापृष्ठ की तुलना में प्रोग्रामिंग भाषाओं की एक विस्तृत श्रृंखला से मूल रूप से एक्सेस करने की अनुमति देता है।

कक्षाएं

एक सीओएम वर्ग (coclass) एक या एक से अधिक अंतरापृष्ठ का एक ठोस कार्यान्वयन है, और वस्तु-उन्मुख प्रोग्रामिंग भाषाओं में कक्षाओं के समान है। कक्षाएं उनकी क्लास आईडी (CLSID) या उनके प्रोग्रामेटिक आइडेंटिफ़ायर स्ट्रिंग (ProgID) के आधार पर बनाई जाती हैं। कई वस्तु-उन्मुख भाषाओं की तरह, सीओएम अंतरापृष्ठ को कार्यान्वयन से अलग करता है। यह अंतर विशेष रूप से सीओएम में मजबूत है, जहां वस्तुओं को सीधे एक्सेस नहीं किया जा सकता है, लेकिन केवल उनके अंतरापृष्ठ के माध्यम से। सीओएम के पास एक ही अंतरापृष्ठ के कई कार्यान्वयन के लिए समर्थन भी है, ताकि रन टाइम (प्रोग्राम जीवनचक्र चरण) पर क्लाइंट यह चुन सकें कि अंतरापृष्ठ के किस कार्यान्वयन को तुरंत चालू किया जाए।

अंतरापृष्ठ परिभाषा भाषा और प्रकार पुस्तकालय

प्रकार पुस्तकालयों में सीओएम प्रकारों का प्रतिनिधित्व करने के लिए मेटाडेटा होता है। इन प्रकारों को माइक्रोसॉफ्ट अंतरापृष्ठ परिभाषा भाषा (एमएसआईडीएल/आईडीएल) का उपयोग करके वर्णित किया गया है। आईडीएल फाइलें ऑब्जेक्ट-ओरिएंटेड क्लासेस, अंतरापृष्ठ, स्ट्रक्चर्स, एन्यूमरेशन और अन्य यूजर-डिफाइन्ड टाइप्स को भाषा स्वतंत्र तरीके से परिभाषित करती हैं। आईडीएल कुछ अतिरिक्त कीवर्ड जैसे अंतरापृष्ठ और कक्षाओं के संग्रह को परिभाषित करने के लिए अंतरापृष्ठ और लाइब्रेरी के साथ C ++ घोषणाओं के समान है। आईडीएल अतिरिक्त जानकारी प्रदान करने के लिए घोषणा से पहले ब्रैकेटेड विशेषताओं के उपयोग का भी समर्थन करता है, जैसे कि अंतरापृष्ठ GUID और पॉइंटर पैरामीटर और लंबाई फ़ील्ड के बीच संबंध। आईडीएल फाइलें एमआईडीएल कंपाइलर द्वारा संकलित की जाती हैं। C/C++ के लिए, Mआईडीएल कंपाइलर एक कंपाइलर-स्वतंत्र हेडर फ़ाइल बनाता है जिसमें घोषित अंतरापृष्ठ की वर्चुअल मेथड टेबल से मिलान करने के लिए स्ट्रक्चर डेफिनिशन होता है और एक C फाइल जिसमें अंतरापृष्ठ ग्लोबली यूनिक आइडेंटिफायर की घोषणा होती है। एक प्रॉक्सी मॉड्यूल के लिए C++ स्रोत कोड भी Mआईडीएल संकलक द्वारा उत्पन्न किया जा सकता है। इस प्रॉक्सी में प्रक्रिया से बाहर संचार के लिए डीसीओएम को सक्षम करने के लिए सीओएम कॉल को दूरस्थ प्रक्रिया कॉल में परिवर्तित करने के लिए विधि स्टब्स हैं। आईडीएल फाइलों को एमआईडीएल कंपाइलर द्वारा टाइप लाइब्रेरी (टीएलबी) में भी संकलित किया जा सकता है। TLB फ़ाइलों में बाइनरी मेटाडेटा होता है जिसे TLB में परिभाषित सीओएम प्रकारों का प्रतिनिधित्व करने के लिए भाषा-विशिष्ट निर्माण उत्पन्न करने के लिए विभिन्न भाषा संकलक और रनटाइम वातावरण (जैसे वीबीएक्स, डेल्फी, .नेट आदि) द्वारा संसाधित किया जा सकता है। सी ++ के लिए, यह टीएलबी को वापस अपने आईडीएल प्रतिनिधित्व में परिवर्तित कर देगा।

ऑब्जेक्ट फ्रेमवर्क

क्योंकि सीओएम एक रनटाइम फ्रेमवर्क है, प्रकारों को व्यक्तिगत रूप से पहचाने जाने योग्य और रनटाइम पर निर्दिष्ट करने योग्य होना चाहिए। इसे प्राप्त करने के लिए, विश्व स्तर पर विशिष्ट पहचानकर्ता (GUIDs) का उपयोग किया जाता है। रनटाइम पर पहचान के लिए प्रत्येक सीओएम प्रकार को अपना स्वयं का GUID नामित किया गया है। संकलन समय और रनटाइम दोनों पर सीओएम प्रकारों की जानकारी तक पहुँचने के लिए, सीओएम प्रकार पुस्तकालयों का उपयोग करता है। यह प्रकार पुस्तकालयों के प्रभावी उपयोग के माध्यम से है कि सीओएम वस्तुओं की बातचीत के लिए गतिशील ढांचे के रूप में अपनी क्षमताओं को प्राप्त करता है।

आईडीएल में निम्नलिखित उदाहरण कोक्लास परिभाषा पर विचार करें:

coclass SomeClass {
  [default] interface ISomeInterface;
};

उपरोक्त कोड खंड नामित एक सीओएम वर्ग घोषित करता है SomeClass जो नाम के एक अंतरापृष्ठ को लागू करता है ISomeIएनटीerface.

यह वैचारिक रूप से निम्नलिखित C++ वर्ग को परिभाषित करने के बराबर है:

class SomeClass : public ISomeInterface {
  ...
  ...
};

जहाँ ISomeIएनटीerface एक C++ शुद्ध आभासी वर्ग है (जिसे कभी-कभी एब्स्ट्रैक्ट बेस क्लास भी कहा जाता है)।

सीओएम अंतरापृष्ठ और कक्षाओं वाली आईडीएल फाइलें टाइप लाइब्रेरी (TLB) फाइलों में संकलित की जाती हैं, जिन्हें बाद में रनटाइम पर क्लाइंट द्वारा पार्स किया जा सकता है, यह निर्धारित करने के लिए कि कौन सा अंतरापृष्ठ किसी ऑब्जेक्ट का समर्थन करता है, और किसी ऑब्जेक्ट के अंतरापृष्ठ तरीकों को लागू करता है।

सी ++ में, सीओएम ऑब्जेक्ट्स को तत्काल किया जाता है CoCreateInstance फ़ंक्शन जो क्लास आईडी (CLSID) और अंतरापृष्ठ आईडी (IID) को तर्क के रूप में लेता है। की तात्कालिकता SomeClass निम्नानुसार कार्यान्वित किया जा सकता है:

ISomeInterface* interface_ptr = NULL;
HRESULT hr = CoCreateInstance(CLSID_SomeClass, NULL, CLSCTX_ALL,
                              IID_ISomeInterface, (void**)&interface_ptr);

इस उदाहरण में, सीओएम सब-सिस्टम का उपयोग किसी ऑब्जेक्ट के लिए पॉइंटर प्राप्त करने के लिए किया जाता है जो लागू होता है ISomeIएनटीerface अंतरापृष्ठ, और coclass CLSID_SomeClass के इस अंतरापृष्ठ के विशेष कार्यान्वयन की आवश्यकता है।

संदर्भ गिनती

ऑब्जेक्ट जीवनकाल प्रबंधित करने के लिए सभी सीओएम ऑब्जेक्ट संदर्भ गणना का उपयोग करते हैं। सभी सीओएम ऑब्जेक्ट लागू करने वाले अनिवार्य I अज्ञात अंतरापृष्ठ में AddRef और रिलीज़ विधियों के माध्यम से क्लाइंट द्वारा संदर्भ संख्या को नियंत्रित किया जाता है। सीओएम ऑब्जेक्ट तब अपनी स्वयं की मेमोरी को मुक्त करने के लिए ज़िम्मेदार होते हैं जब संदर्भ संख्या शून्य हो जाती है। कुछ भाषाएं (जैसे विज़ुअल बेसिक) स्वत: संदर्भ गणना प्रदान करती हैं ताकि सीओएम ऑब्जेक्ट डेवलपर्स को अपने स्रोत कोड में किसी आंतरिक संदर्भ काउंटर को स्पष्ट रूप से बनाए रखने की आवश्यकता न हो। सी ++ में, एक कोडर या तो स्पष्ट संदर्भ गणना कर सकता है या संदर्भ गणनाओं को स्वचालित रूप से प्रबंधित करने के लिए स्मार्ट सूचक ्स का उपयोग कर सकता है।

AddRef को कब कॉल करना है और सीओएम ऑब्जेक्ट्स पर रिलीज़ करना है, इसके लिए निम्नलिखित दिशानिर्देश हैं:

  • फ़ंक्शंस और विधियाँ जो अंतरापृष्ठ संदर्भ लौटाती हैं (वापसी मान या आउट पैरामीटर के माध्यम से) लौटने से पहले लौटाई गई वस्तु की संदर्भ संख्या में वृद्धि होगी।
  • पॉइंटर के अधिलेखित होने या दायरे से बाहर होने से पहले अंतरापृष्ठ पॉइंटर पर रिलीज़ को कॉल किया जाना चाहिए।
  • यदि अंतरापृष्ठ संदर्भ सूचक पर प्रतिलिपि बनाई जाती है, तो उस सूचक पर AddRef को कॉल किया जाना चाहिए।
  • AddRef और रिलीज को विशिष्ट अंतरापृष्ठ पर कॉल किया जाना चाहिए जिसे संदर्भित किया जा रहा है क्योंकि ऑब्जेक्ट प्रति-अंतरापृष्ठ संदर्भ गणनाओं को कार्यान्वित कर सकता है ताकि केवल संदर्भित अंतरापृष्ठ के लिए आंतरिक संसाधनों को आवंटित किया जा सके।

तार पर दूरस्थ वस्तुओं को सभी संदर्भ गणना कॉल नहीं भेजी जाती हैं; एक प्रॉक्सी दूरस्थ वस्तु पर केवल एक संदर्भ रखता है और अपनी स्थानीय संदर्भ संख्या को बनाए रखता है। सीओएम के विकास को सरल बनाने के लिए, माइक्रोसॉफ्ट ने C++ डेवलपर्स के लिए सक्रिय टेम्पलेट लाइब्रेरी | ATL (एक्टिव टेम्प्लेट लाइब्रेरी) के प्रारम्भ की। ATL एक उच्च-स्तरीय सीओएम विकास प्रतिमान प्रदान करता है। यह सीओएम क्लाइंट एप्लिकेशन डेवलपर्स को स्मार्ट पॉइंटर ऑब्जेक्ट प्रदान करके सीधे संदर्भ गिनती बनाए रखने की आवश्यकता से भी बचाता है। अन्य पुस्तकालय और भाषाएँ जो सीओएम-जागरूक हैं, उनमें माइक्रोसॉफ्ट Foundation Classes, Visual C++ सीओएमpiler सीओएम Support, सम्मिलित हैं।[12] वीबीस्क्रिप्ट, विजुअल बेसिक 2005 एक्सप्रेस संस्करण, ईसीएमएस्क्रिप्ट ([[एकमा स्क्रिप्ट]]) और बोरलैंड डेल्फी

प्रोग्रामिंग

सीओएम एक भाषा-स्वतंत्र विनिर्देश बाइनरी मानक है जिसे किसी भी प्रोग्रामिंग भाषा में विकसित किया जा सकता है जो इसके बाइनरी परिभाषित डेटा प्रकारों और अंतरापृष्ठ को समझने और कार्यान्वित करने में सक्षम है। सीओएम कार्यान्वयन सीओएम वातावरण में प्रवेश करने और छोड़ने, सीओएम ऑब्जेक्ट्स को तत्काल और संदर्भ-गणना करने, समर्थित अंतरापृष्ठ के लिए ऑब्जेक्ट क्वेरी करने, साथ ही साथ त्रुटियों को संभालने के लिए ज़िम्मेदार हैं। माइक्रोसॉफ्ट विज़ुअल सी ++ कंपाइलर सी ++ एट्रिब्यूट्स के रूप में संदर्भित सी ++ भाषा के एक्सटेंशन का समर्थन करता है।[13] ये एक्सटेंशन सीओएम विकास को आसान बनाने और C++ में सीओएम सर्वरों को लागू करने के लिए आवश्यक बॉयलरप्लेट कोड को हटाने के लिए डिज़ाइन किए गए हैं।[14]


रजिस्ट्री उपयोग

विंडोज में, सीओएम क्लासेस, अंतरापृष्ठ और टाइप लाइब्रेरी को GUID द्वारा विंडोज रजिस्ट्री में सूचीबद्ध किया गया है, HKEY_CLASSES_ROOT\CLSID के तहत कक्षाओं के लिए और HKEY_CLASSES_ROOT\Iएनटीerface अंतरापृष्ठ के लिए। सीओएम लायब्रेरी प्रत्येक सीओएम ऑब्जेक्ट या किसी दूरस्थ सेवा के लिए नेटवर्क स्थान के लिए या तो सही स्थानीय लायब्रेरी का पता लगाने के लिए रजिस्ट्री का उपयोग करें।

पंजीकरण मुक्त कॉम

पंजीकरण-मुक्त सीओएम (RegFree सीओएम) विंडोज़ XP के साथ प्रारम्भ की गई एक तकनीक है जो घटक ऑब्जेक्ट मॉडल (सीओएम) सॉफ़्टवेयर घटक को सक्रियण मेटा डेटा और CLSID को संग्रहीत करने की अनुमति देती है (Class ID) विंडोज़ रजिस्ट्री का उपयोग किए बिना घटक के लिए। इसके बजाय, घटक में लागू वर्गों के मेटाडेटा और सीएलएसआईडी को एक मेनिफेस्ट (सीएलआई) (एक्सएमएल का उपयोग करके वर्णित) में घोषित किया जाता है, या तो निष्पादन योग्य संसाधन के रूप में या घटक के साथ स्थापित एक अलग फ़ाइल के रूप में संग्रहीत किया जाता है।[15] यह एक ही घटक के कई संस्करणों को अलग-अलग निर्देशिकाओं में स्थापित करने की अनुमति देता है, जो उनके स्वयं के प्रकटीकरण के साथ-साथ XCOPY परिनियोजन द्वारा वर्णित है।[16] इस तकनीक में EXE सीओएम सर्वरों के लिए सीमित समर्थन है[17] और सिस्टम-व्यापी घटकों जैसे माइक्रोसॉफ्ट डेटा एक्सेस घटक, MSएक्सएमएल, डायरेक्टX या Iएनटीerनेट Explorer के लिए उपयोग नहीं किया जा सकता है।

एप्लिकेशन लोड होने के दौरान, विंडोज लोडर मेनिफेस्ट की खोज करता है।[18] यदि यह मौजूद है, तो लोडर इससे सक्रियण संदर्भ में जानकारी जोड़ता है।[16]जब सीओएम क्लास फ़ैक्टरी किसी क्लास को इंस्टेंट करने की कोशिश करती है, तो सक्रियण संदर्भ को पहले यह देखने के लिए चेक किया जाता है कि क्या CLSID के लिए कार्यान्वयन पाया जा सकता है। केवल अगर लुकअप विफल हो जाता है, तो विंडोज़ रजिस्ट्री स्कैन की जाती है।[16]


मैन्युअल रूप से सीओएम ऑब्जेक्ट्स को इंस्टेंट करना

डायनेमिक-लिंक लाइब्रेरी फ़ाइल और ऑब्जेक्ट के GUID के पथ को देखते हुए सीओएम ऑब्जेक्ट मैन्युअल रूप से भी बनाए जा सकते हैं। इसके लिए डीएलएल या GUID को सिस्टम रजिस्ट्री में पंजीकृत करने की आवश्यकता नहीं है, और मेनिफेस्ट फ़ाइलों का उपयोग नहीं करता है। एक सीओएम डीएलएल डीएलएलGetClassObject नामक फ़ंक्शन निर्यात करता है। वांछित GUID और IID_IClassFactory के साथ डीएलएलGetClassObject को कॉल करना फ़ैक्टरी (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) का एक उदाहरण प्रदान करता है। फ़ैक्टरी ऑब्जेक्ट में एक CreateInstance विधि है, जो एक अंतरापृष्ठ GUID दिए गए ऑब्जेक्ट के उदाहरण बना सकती है।[19] पंजीकृत सीओएम घटकों के उदाहरण बनाते समय आंतरिक रूप से उपयोग की जाने वाली यह वही प्रक्रिया है।[20] यदि बनाया गया सीओएम ऑब्जेक्ट जेनेरिक CoCreateInstance एपीआई का उपयोग करके किसी अन्य सीओएम ऑब्जेक्ट को तुरंत चालू करता है, तो यह रजिस्ट्री या मेनिफेस्ट फ़ाइलों का उपयोग करके सामान्य सामान्य तरीके से ऐसा करने का प्रयास करेगा। लेकिन यह आंतरिक वस्तुओं (जो बिल्कुल भी पंजीकृत नहीं हो सकता है) बना सकता है, और अपने स्वयं के निजी ज्ञान का उपयोग करते हुए, उन्हें अंतरापृष्ठ के संदर्भ सौंप सकता है।

प्रक्रिया और नेटवर्क पारदर्शिता

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

थ्रेडिंग

सीओएम में, थ्रेडिंग को एक अवधारणा के माध्यम से संबोधित किया जाता है जिसे अपार्टमेंट कहा जाता है।[21] एक व्यक्तिगत सीओएम ऑब्जेक्ट बिल्कुल एक अपार्टमेंट में रहता है, जो सिंगल-थ्रेडेड या मल्टी-थ्रेडेड हो सकता है। सीओएम में तीन प्रकार के अपार्टमेंट हैं: सिंगल थ्रेडिंग | सिंगल-थ्रेडेड अपार्टमेंट (STA), मल्टी-थ्रेडेड अपार्टमेंट (MTA) और थ्रेड न्यूट्रल अपार्टमेंट (NA)। प्रत्येक अपार्टमेंट एक तंत्र का प्रतिनिधित्व करता है जिससे किसी वस्तु की आंतरिक स्थिति को कई धागों में सिंक्रनाइज़ किया जा सकता है। एक प्रक्रिया में कई सीओएम ऑब्जेक्ट सम्मिलित हो सकते हैं, जिनमें से कुछ STA का उपयोग कर सकते हैं और अन्य MTA का उपयोग कर सकते हैं। सीओएम ऑब्जेक्ट तक पहुँचने वाले सभी थ्रेड समान रूप से एक अपार्टमेंट में रहते हैं। सीओएम ऑब्जेक्ट्स और थ्रेड्स के लिए अपार्टमेंट का चुनाव रन-टाइम पर निर्धारित होता है, और इसे बदला नहीं जा सकता।

अपार्टमेंट का प्रकार विवरण
सिंगल-थ्रेडेड अपार्टमेंट[22] ( STA), (ThreadingModel=Apartmeएनटी) वस्तु के तरीकों को निष्पादित करने के लिए एक एकल धागा समर्पित है। ऐसी व्यवस्था में, अपार्टमेंट के बाहर थ्रेड्स से विधि कॉल marshalled हैं और स्वचालित रूप से सिस्टम द्वारा कतारबद्ध हैं (एक मानक विंडोज संदेश कतार के माध्यम से)। इस प्रकार, सीओएम रन-टाइम यह सुनिश्चित करने के लिए स्वत: सिंक्रनाइज़ेशन प्रदान करता है कि किसी ऑब्जेक्ट की प्रत्येक विधि कॉल हमेशा दूसरे को लागू करने से पहले पूरा करने के लिए निष्पादित की जाती है। इसलिए डेवलपर को थ्रेड लॉकिंग या दौड़ की स्थिति के बारे में चिंता करने की ज़रूरत नहीं है।
मल्टी-थ्रेडेड अपार्टमेंट[23] ( एमटीए), (थ्रेडिंगमॉडल=फ्री) सीओएम रन-टाइम कोई सिंक्रनाइज़ेशन प्रदान नहीं करता है, और एकाधिक थ्रेड्स को सीओएम ऑब्जेक्ट को एक साथ कॉल करने की अनुमति है। इसलिए सीओएम ऑब्जेक्ट्स को दौड़ की स्थिति उत्पन्न करने से एकाधिक धागे से एक साथ पहुंच को रोकने के लिए अपना स्वयं का सिंक्रनाइज़ेशन करने की आवश्यकता होती है। किसी STA में किसी थ्रेड से किसी MTA ऑब्जेक्ट के लिए कॉल भी मार्शल किए जाते हैं।
गतिशील रूप से निर्धारित अपार्टमेंट (ThreadingModel=Both) दोनों अपार्टमेंट मोड में, सर्वर कॉलिंग थ्रेड के अपार्टमेंट प्रकार से मिलान करने के लिए वस्तु निर्माण पर STA या MTA का स्वतः चयन करता है।[24] यह ओवरहेड मार्शलिंग से बचने के लिए उपयोगी हो सकता है जब MTA सर्वर को STA थ्रेड द्वारा एक्सेस किया जाता है।
थ्रेड न्यूट्रल अपार्टमेंट (एनए), (थ्रेडिंगमॉडल=न्यूट्रल) बिना किसी नियत धागे के एक विशेष अपार्टमेंट। जब एक एसटीए या एमटीए थ्रेड एक एनए ऑब्जेक्ट को उसी प्रक्रिया में कॉल करता है, तो कॉलिंग थ्रेड अस्थायी रूप से अपना अपार्टमेंट छोड़ देता है और बिना किसी थ्रेड स्विचिंग के एनए में सीधे कोड निष्पादित करता है।[25] इसलिए, कोई भी कुशल इंटर-अपार्टमेंट विधि के लिए NA को एक अनुकूलन के रूप में सोच सकता है कॉल।

थ्रेड्स और ऑब्जेक्ट जो एक ही अपार्टमेंट से संबंधित हैं, समान थ्रेड एक्सेस नियमों का पालन करते हैं। मेथड कॉल्स जो एक ही अपार्टमेंट के अंदर की जाती हैं इसलिए सीधे सीओएम की सहायता के बिना की जाती हैं। अपार्टमेंट में किए गए मेथड कॉल मार्शलिंग के माध्यम से प्राप्त किए जाते हैं। इसके लिए प्रॉक्सी और स्टब्स के उपयोग की आवश्यकता होती है।

आलोचना

चूंकि सीओएम का कार्यान्वयन काफी जटिल है, प्रोग्रामर कुछ प्लंबिंग मुद्दों से विचलित हो सकते हैं।

संदेश पम्पिंग

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

संदर्भ गिनती

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

डीएलएल नरक

क्योंकि इन-प्रोसेस सीओएम घटक डीएलएल फ़ाइलों में कार्यान्वित किए जाते हैं और पंजीकरण केवल CLSID प्रति एक संस्करण के लिए अनुमति देता है, वे कुछ स्थितियों में डीएलएल नरक प्रभाव के अधीन हो सकते हैं। पंजीकरण-मुक्त सीओएम क्षमता इन-प्रोसेस घटकों के लिए इस समस्या को समाप्त करती है; आउट-ऑफ़-प्रोसेस सर्वर के लिए पंजीकरण-मुक्त सीओएम उपलब्ध नहीं है।

यह भी देखें

टिप्पणियाँ

  1. "दस्तावेज़ीकरण संग्रह". developer.apple.com.
  2. "प्लग-इन और माइक्रोसॉफ्ट के COM". Apple Inc. Retrieved October 5, 2010.
  3. Microsoft forum: Binary compatibility across Visual C++ versions
  4. "नेटवर्क डीडीई के बारे में - विंडोज़ अनुप्रयोग". Microsoft.com. May 30, 2018.
  5. "Code Execution Technique Takes Advantage of Dynamic Data Exchange". McAfee.com. October 27, 2017.
  6. Brown, Nina; Kindel, Charlie (March 11, 1998). "draft-brown-dcom-v1-spec-03 - Distributed Component Object Model Protocol -- DCOM/1.0". Ietf Datatracker. Retrieved August 29, 2019.
  7. rpetrusha. "रनटाइम कॉल करने योग्य रैपर". msdn.microsoft.com.
  8. rpetrusha. "COM कॉल करने योग्य रैपर". msdn.microsoft.com.
  9. Steinberg, Jill (March 1, 1997). "कांटेदार पैनलिस्ट के लिए प्रतिस्पर्धी घटक बनाते हैं". JavaWorld. Retrieved 2020-07-16.
  10. "win32com Documentation Index". docs.activestate.com.
  11. "पायथन और कॉम". www.boddie.org.uk.
  12. "कंपाइलर कॉम सपोर्ट". MSDN. Microsoft.
  13. Microsoft MSDN: C++ Attributes Reference
  14. MSDN Magazine: C++ Attributes: Make COM Programming a Breeze with New Feature in Visual Studio .NET
  15. "विधानसभा प्रकट". MSDN. Retrieved November 5, 2009.
  16. 16.0 16.1 16.2 Dave Templin. "क्लिकऑन और पंजीकरण-मुक्त COM के साथ ऐप परिनियोजन को सरल बनाएं". MSDN Magazine. Retrieved April 22, 2008.
  17. "किसी आउट-ऑफ़-प्रोसेस COM सर्वर का उसकी tlb फ़ाइल के बिना उपयोग कैसे करें". Retrieved April 16, 2011.
  18. "पृथक अनुप्रयोगों और साथ-साथ असेंबलियों की अवधारणा". MSDN. Retrieved February 5, 2016.
  19. Arkhipov, Mikhail (April 1, 2005). "पंजीकरण मुक्त कॉम". MSDN Blogs. Retrieved April 29, 2016.
  20. "DllGetClassObject प्रवेश बिंदु (COM)". MSDN. If a call to the CoGetClassObject function finds the class object that is to be loaded in a DLL, CoGetClassObject uses the DLL's exported DllGetClassObject function.
  21. Microsoft MSDN: Processes, Threads, and Apartments
  22. Microsoft MSDN: सिंगल-थ्रेडेड अपार्टमेंट
  23. Microsoft MSDN: मल्टीथ्रेडेड अपार्टमेंट्स
  24. Microsoft MSDN: us/library/ms809971.aspx COM थ्रेडिंग मॉडल को समझना और उपयोग करना
  25. Codeguru: /cpp/com-tech/activex/apts/article.php/c5529/Understanding-COM-Apartments-Part-I.htm COM अपार्टमेंट्स को समझना


संदर्भ


बाहरी संबंध