2012-03-06 20 views
20

एमएसवीसी में एक एटीएल परियोजना बनाना एक परियोजना नहीं बल्कि दो परियोजनाओं को बनाना प्रतीत होता है; उत्तरार्द्ध ने पूर्व के समान नाम दिया लेकिन पीएस के साथ इसके नाम पर जोड़ा गया। इस दूसरी परियोजना का उद्देश्य क्या है और मैं कैसे बता सकता हूं कि मुझे इसकी आवश्यकता है या नहीं?

+2

"पीएस" प्रॉक्सी/स्टब के लिए खड़ा है, शायद कोई मेरे से अधिक जानता है इसका मतलब क्या है! – ybungalobill

उत्तर

31

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

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

प्रॉक्सी का प्राथमिक कार्य विधि कॉल के तर्कों को स्मृति बफर या नेटवर्क पैकेट में क्रमबद्ध करना है। यह बहुत ही अनौपचारिक हो सकता है, खासकर जब आप परिवर्तनीय आकार के संरचनाओं के लिए पॉइंटर्स का उपयोग करते हैं। COM को यह अधिकार प्राप्त करने में सहायता चाहिए और यह आपके FooPS प्रोजेक्ट का काम है। जब आप अपनी .idl फ़ाइल पर midl.exe चलाते हैं, तो मिडल प्रॉक्सी और स्टब को लागू करने के लिए इंटरफ़ेस परिभाषाओं से कोड उत्पन्न करता है। यह अक्सर काफी अच्छा होता है लेकिन मिडल में अंतर्निहित कीवर्ड आपके डेटा का वर्णन करने के लिए पर्याप्त नहीं हैं, तो आपको स्वयं को लागू करने की आवश्यकता हो सकती है।

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

+4

कमाल का जवाब ... मेरा दिन बनाया :) – Houston

4

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

6

जैसा कि @ebutusov ने कहा, * पीएस प्रोजेक्ट में Proxy and Stub के लिए कार्यान्वयन शामिल हैं। वे मानक नहीं हैं, इसके बजाय वे आपके एटीएल सर्वर से निर्यात किए गए इंटरफेस के लिए एमआईडीएल द्वारा उत्पन्न होते हैं। इन इंटरफेस को * .IDL फ़ाइल में घोषित किया गया है। परियोजना का आउटपुट डीएलएल है। अधिक जानकारी प्राप्त करने के लिए आप this article पढ़ सकते हैं।

यदि आप * .IDL फ़ाइल में किसी भी कस्टम इंटरफेस को परिभाषित नहीं करते हैं तो आप समाधान से पीएस प्रोजेक्ट को हटा सकते हैं या यदि आप केवल इंटरफेस को परिभाषित करते हैं जिसमें दोहरी और oleautomation modifiers हैं। उस स्थिति में एक मानक टाइपेलिब मार्शलर का उपयोग किया जाएगा।

आदेश मानक typelib marshaller का उपयोग करने में सक्षम होने के लिए, एक एक typelibrary (जो किया जाता है स्वचालित रूप से जब से तुम ATL उपयोग कर रहे हैं)

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