एमएसवीसी में एक एटीएल परियोजना बनाना एक परियोजना नहीं बल्कि दो परियोजनाओं को बनाना प्रतीत होता है; उत्तरार्द्ध ने पूर्व के समान नाम दिया लेकिन पीएस के साथ इसके नाम पर जोड़ा गया। इस दूसरी परियोजना का उद्देश्य क्या है और मैं कैसे बता सकता हूं कि मुझे इसकी आवश्यकता है या नहीं?
उत्तर
COM इंटरफेस विधि दो अलग धागे भर में कॉल बनाना समर्थित रजिस्टर करने के लिए है, दो अलग प्रक्रियाओं या दो अलग मशीनें। इसे मार्शलिंग कहा जाता है। दो अलग-अलग धागे सबसे आम मामले हैं, एक COM सर्वर अक्सर थ्रेड-सुरक्षित नहीं होता है। COM 'एकल' धागे से सर्वर को बनाए गए थ्रेड तक कॉल को मार्शल करके इस तरह के सिंगल-थ्रेडेड कोक्लास के लिए थ्रेड-सुरक्षा लागू करता है। प्रक्रियाओं के बीच मार्शलिंग तब होती है जब आप आउट-ऑफ-प्रोसेस सर्वर लिखते हैं। नेटवर्क पर विभिन्न मशीनों के बीच DCOM कहा जाता है।
यह इंटरफ़ेस का एक उदाहरण बनाकर लागू किया गया है जो मूल मूल जैसा दिखता है। लेकिन इंटरफ़ेस के सभी तरीके वास्तव में विकल्प हैं जो कॉल को मार्शल करने का काम करते हैं। यह प्रॉक्सी है। तार के दूसरे छोर पर एक विकल्प है जो इंटरफेस की तरह बिल्कुल दिखता है लेकिन विपरीत काम करता है। यह स्टब है। प्रॉक्सी और स्टब एक साथ काम करते हैं ताकि भ्रम पैदा हो सके कि आप अपने प्रोग्राम में एक साधारण विधि कॉल कर रहे हैं।
प्रॉक्सी का प्राथमिक कार्य विधि कॉल के तर्कों को स्मृति बफर या नेटवर्क पैकेट में क्रमबद्ध करना है। यह बहुत ही अनौपचारिक हो सकता है, खासकर जब आप परिवर्तनीय आकार के संरचनाओं के लिए पॉइंटर्स का उपयोग करते हैं। COM को यह अधिकार प्राप्त करने में सहायता चाहिए और यह आपके FooPS प्रोजेक्ट का काम है। जब आप अपनी .idl फ़ाइल पर midl.exe चलाते हैं, तो मिडल प्रॉक्सी और स्टब को लागू करने के लिए इंटरफ़ेस परिभाषाओं से कोड उत्पन्न करता है। यह अक्सर काफी अच्छा होता है लेकिन मिडल में अंतर्निहित कीवर्ड आपके डेटा का वर्णन करने के लिए पर्याप्त नहीं हैं, तो आपको स्वयं को लागू करने की आवश्यकता हो सकती है।
अंतिम लेकिन कम से कम नहीं, विंडोज एक मानक मार्शलर प्रदान करता है जो सरल इंटरफेस मार्शल कर सकता है। COM ऑटोमेशन द्वारा परिभाषित COM के उप-सेट का समर्थन करने के लिए डिज़ाइन किया गया है। दूसरे शब्दों में, आईडीस्पेच से प्राप्त इंटरफ़ेस और केवल स्वचालन संगत प्रकारों का उपयोग करें। आपको केवल इसे सक्षम करने के लिए रजिस्ट्री प्रविष्टियों को प्राप्त करने की आवश्यकता है और अन्यथा मिडल द्वारा उत्पन्न प्रॉक्सी/स्टब की आवश्यकता नहीं है। और निश्चित रूप से, यदि आप केवल एक थ्रेड पर सरल इन-प्रोसेस कॉल करते हैं तो आपको इसकी आवश्यकता नहीं होगी। यह बहुत आम है।
कमाल का जवाब ... मेरा दिन बनाया :) – Houston
यह प्रॉक्सी/स्टब कोड है, जिसमें अलग-अलग अपार्टमेंट (थ्रेडिंग संबंधित) के बीच डेटा स्थानांतरित करने के लिए आवश्यक गैर-मानक डेटा मार्शलर शामिल हैं। इसका उपयोग तब किया जाता है जब एप्लिकेशन, जो आपके COM ऑब्जेक्ट को कॉल करता है, विभिन्न COM थ्रेडिंग मॉडल का उपयोग करता है। मुख्य कोड में इस कोड को मर्ज करने के लिए एटीएल/COM विज़ार्ड में एक विकल्प था। कई सामान्य परिदृश्यों में आपको इसके बारे में चिंता करने की ज़रूरत नहीं है (यानी जब आपका COM dll क्लाइंट संदर्भ में चलता है), जब तक आप एक कस्टम मार्शलर लिखना नहीं चाहते हैं।
जैसा कि @ebutusov ने कहा, * पीएस प्रोजेक्ट में Proxy and Stub के लिए कार्यान्वयन शामिल हैं। वे मानक नहीं हैं, इसके बजाय वे आपके एटीएल सर्वर से निर्यात किए गए इंटरफेस के लिए एमआईडीएल द्वारा उत्पन्न होते हैं। इन इंटरफेस को * .IDL फ़ाइल में घोषित किया गया है। परियोजना का आउटपुट डीएलएल है। अधिक जानकारी प्राप्त करने के लिए आप this article पढ़ सकते हैं।
यदि आप * .IDL फ़ाइल में किसी भी कस्टम इंटरफेस को परिभाषित नहीं करते हैं तो आप समाधान से पीएस प्रोजेक्ट को हटा सकते हैं या यदि आप केवल इंटरफेस को परिभाषित करते हैं जिसमें दोहरी और oleautomation modifiers हैं। उस स्थिति में एक मानक टाइपेलिब मार्शलर का उपयोग किया जाएगा।
आदेश मानक typelib marshaller का उपयोग करने में सक्षम होने के लिए, एक एक typelibrary (जो किया जाता है स्वचालित रूप से जब से तुम ATL उपयोग कर रहे हैं)
- 1. var foo = foo || चेतावनी (foo);
- 2. int foo = foo
- 3. "x && foo()" क्या है?
- 4. "foo"
- 5. क्या [foo] {...} कैप्चर और [foo] {...} कैप्चर किया गया है यदि 'foo' संदर्भ चर है?
- 6. इसका क्या अर्थ है? int foo = foo + 4;
- 7. "#if Foo - 0 == 0" और "#if परिभाषित (Foo) और& Foo == 0" के बीच क्या अंतर है?
- 8. @synthesize foo = _foo क्या है?
- 9. jQuery में, चयनकर्ता $ ('[id = foo]') $ ('# foo') से कम कुशल है?
- 10. $ ("# foo .bar") और $ ("। Bar", "#foo") के प्रदर्शन की तुलना में
- 11. क्यों "foo" .toString() toString.call ("foo") के समान नहीं है?
- 12. svn: मौजूदा dierctory <foo> के यूआरएल <foo> अपेक्षित यूआरएल <foo>
- 13. क्या सी ++ या सी में foo (शून्य) और foo() के बीच कोई अंतर है?
- 14. __PACKAGE __-> {foo} का क्या अर्थ है?
- 15. कमांड प्रतिस्थापन $ (foo) bashism है?
- 16. os.environ ['foo'] कब os.getenv ('foo') से मेल नहीं खाता होगा?
- 17. आर: apt-get install r-cran-foo बनाम install.packages ("foo")
- 18. jQuery $ .प्रत्येक (आगमन, foo) बनाम $ (आगमन) .प्रत्येक (foo)
- 19. सी ++ पॉलिमॉर्फिज्म ((एक्स *) वाई) -> foo() बनाम ((एक्स) * वाई) .foo()
- 20. @ManyToMany (mappedBy = "foo")
- 21. PostgreSQL स्तंभ 'foo'
- 22. क्या "foo is none" और "foo == कोई नहीं" के बीच कोई अंतर है?
- 23. PHP गति: तेज़ क्या है? अगर (जारी ($ foo)) या यदि ($ foo == true)
- 24. फू एफ = फू(); // 'Foo :: Foo (Foo)' पर कॉल करने के लिए कोई मिलान करने वाला फ़ंक्शन नहीं ... हुह?
- 25. जब मैं/foo या/foo/पूछता हूं तो अमेज़ॅन एस 3 स्वचालित रूप से /foo/index.html क्यों नहीं देता है?
- 26. क्यों ("foo" === नया स्ट्रिंग ("foo")) जावास्क्रिप्ट में झूठे का मूल्यांकन करता है?
- 27. गो कोड में यह "foo। (Bar.Baz)" चीज़ क्या है?
- 28. जावास्क्रिप्ट में (myVar && foo()) का क्या अर्थ है?
- 29. जावा में if (! Foo) और if (foo == false) के बीच प्रदर्शन अंतर क्या है, यदि कोई है?
- 30. foo.setVisibility (View.GONE) और parent.removeView (foo)
"पीएस" प्रॉक्सी/स्टब के लिए खड़ा है, शायद कोई मेरे से अधिक जानता है इसका मतलब क्या है! – ybungalobill