2010-09-19 16 views
6

एक साधारण सवाल होना चाहिए, लेकिन दस्तावेज खोजना मुझे पागल कर रहा है। मान लीजिए कि मेरे पास एक कोक्लास या इंटरफ़ेस के लिए आईटीपीइन्फो पॉइंटर है। मैं उस वर्ग या इंटरफ़ेस का नाम कैसे प्राप्त करूं?इस प्रकार का नाम पाने के लिए मैं ITypeInfo पॉइंटर का उपयोग कैसे कर सकता हूं?

उत्तर

4

ठीक है। यह बहुत आसान हो गया। आपको ITypeInfo.GetDocumentation विधि को सदस्य आईडी के साथ MEMBERID_NIL (-1) पर सेट करने की आवश्यकता है। इसलिए जैसा:

CComBSTR typeName; 
hr = typeInfo->GetDocumentation(MEMBERID_NIL, &typeName, NULL, NULL, NULL); 

आप नेट में प्रोग्रामिंग कर रहे हैं, इसके बाद के संस्करण आसानी से Marshal.GetTypeInfoName विधि द्वारा आप के लिए किया जाता है:

// using System.Runtime.InteropServices; 
string typeName = Marshal.GetTypeInfoName(typeInfo); 
+0

क्या आप वाकई सह-वर्ग से जुड़े [helpstring] विशेषता की सामग्री को वापस नहीं करते हैं? मुझे गलत साबित करने में खुशी है! –

+1

इसके अलावा, एक COM सह-वर्ग का अंतर्निहित कार्यान्वयन किसी भी प्रकार का वर्ग भी नहीं हो सकता है (COM.c लिखने के उदाहरण के लिए http://www.codeproject.com/KB/COM/com_in_c1.aspx देखें सादा सी में वस्तु)। "कक्षा" की धारणा पूरी तरह से भाषा-निर्भर है और मुझे संदेह है कि आप इस जानकारी को प्राप्त करने के लिए GetDocumentation विधि पर भरोसा कर सकते हैं। –

+1

याद रखें कि मेरा प्रश्न स्वचालन से निपट रहा है। यह COM के माध्यम से एक इंटरफ़ेस पर विधियों को कॉल करने की प्रक्रिया है और उन तरीकों के कार्यान्वयन से पूरी तरह से स्वतंत्र है। प्रश्न में कोक्लास और इंटरफेस ने मेटाडेटा (ITypeInfo के माध्यम से सुलभ) को जोड़ा है, और इसमें उनके नाम शामिल हैं। किसी भी मामले में, आपकी मदद के लिए धन्यवाद। मैं इसकी सराहना करता हूं! –

4

संक्षिप्त उत्तर: आप ITypeInfo का उपयोग नहीं कर सकते। आप Win32 ProgIDFromCLSID API का उपयोग कर कक्षा की प्रोग आईडी प्राप्त कर सकते हैं। COM में अंतर्निहित सी ++ का नाम, COM इंटरफ़ेस या सह-वर्ग को लागू करने वाला विजुअल बेसिक या .NET क्लास व्यावहारिक रूप से व्यर्थ है। केवल इंटरफ़ेस आईडी, क्लास आईडी और प्रोग्रामैटिक आईडी का आपके सह-वर्ग के कार्यान्वयन के स्रोत कोड से परे कोई महत्व है: केवल इन्हें CoCreateInstance एट अल और रनटाइम कास्टिंग QueryInterface का उपयोग करके COM ऑब्जेक्ट को सक्रिय करने के लिए उपयोग किया जा सकता है।

+0

खैर, मैं इस के लिए एक वैध कारण है (लेकिन शायद लगता है मैं नही)। वैसे भी, क्या आप वाकई असंभव हैं? ऐसा लगता है कि विभिन्न माइक्रोसॉफ्ट प्रकार लाइब्रेरी यूटिलिटीज इस जानकारी को गिनने में सक्षम हैं। वह यह कैसे करते हैं? –

+1

ठीक है, प्रायः प्रोग आईडी को चुना जाता है ताकि यह सी ++ वर्ग के नाम के समान या समान हो - लेकिन यह केवल एक सम्मेलन है। अधिकांश प्रकार की लाइब्रेरी यूटिलिटीज या तो Windows रजिस्ट्री या .tlb फ़ाइलों में जानकारी की गणना करती है, जिनमें से सभी क्लास आईडी, इंटरफ़ेस आईडी और प्रोग आईडी के साथ विशेष रूप से सौदे करते हैं। आखिरकार यह आपके COM सर्वर DLL में आपके C++ वर्ग के साथ इन COM मानों को संबद्ध करने के लिए 'DllGetClassObject' के कार्यान्वयन के लिए पूरी तरह से नीचे है। –

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

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