2009-06-24 4 views
5

का उपयोग कर COM स्वचालन मुझे विंडोज वातावरण और COM प्रोग्रामिंग के लिए एक नौसिखिया पर विचार करें।टीएलबी फ़ाइल

मुझे एक एप्लिकेशन (कैनो) पहुंच स्वचालित करना है। कैनो स्वयं को COM सर्वर के रूप में उजागर करता है और CANoe.h, CANoe_i.c और CANoe.tlb फ़ाइलों को प्रदान करता है। कोई भी निर्दिष्ट कर सकता है कि ऑब्जेक्ट तक पहुंचने के लिए, C++ क्लाइंट को कैसे लिखना है, एप्लिकेशन के फ़ंक्शन।

इसके अलावा, कृपया निर्दिष्ट करें कि सी ++ से tlb फ़ाइल में मौजूद कोड को कैसे एक्सेस करें।

उत्तर

9

विजुअल स्टूडियो में आपके सी ++ प्रोजेक्ट में टाइप लाइब्रेरी आयात करने और इस प्रकार परिभाषित वस्तुओं का उपयोग करने के लिए बहुत सारे समर्थन किए गए हैं। उदाहरण के लिए, आप #import निर्देश का उपयोग कर सकते हैं:

#import "CANoe.tlb" 

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

फिर, आपको टाइप लाइब्रेरी में परिभाषित प्रकारों और ऑब्जेक्ट्स के लिए स्मार्ट पॉइंटर रैपर के लिए बहुत सारे टाइपपीफ मिलते हैं। उदाहरण के लिए, अगर वहाँ था एक CoClass Application जो इंटरफेस IApplication कार्यान्वित कहा जाता है, आप ऐसा कर सकता है:

ApplicationPtr app(__uuidof(Application)); 

यह रन टाइम पर कारण होगा, coclass आवेदन बनाया जा और चर app करने के लिए बाध्य है, और आप इसलिए जैसे उस पर कॉल कर सकते हैं:

app->DoSomeCoolStuff(); 

त्रुटि निवारण COM कॉल का परिणाम जाँच, और उचित _com_error अपवाद के रूप में आवश्यक फेंक द्वारा किया जाता है तो यह आप अपवाद सुरक्षित रूप से लिखने की ज़रूरत निकलता है।

1

import का उपयोग करें .tlb फ़ाइल आयात करने के लिए निर्देश - यह आपको COM घटक द्वारा प्रकट इंटरफेस के सी ++ समकक्ष देगा।

आपको रजिस्ट्री में COM घटक पंजीकृत करने की आवश्यकता होगी (घटक की .dll फ़ाइल पर regsvr32 चलाएं)। उसके बाद आप इंटरक्रोसॉफ्ट लागू करने वाले वर्ग का उदाहरण बनाने के लिए CoCreateInstance() (या _com_ptr_t :: CreateInstance() को आमतौर पर अधिक सुविधाजनक के रूप में कॉल कर सकते हैं। फिर आप इंटरफेस के तरीकों को कॉल कर सकते हैं - यह लगभग उसी तरह काम करेगा जैसे कि यह एक सादा सी ++ इंटरफ़ेस और कक्षा था।

+0

धन्यवाद:

एक अंतरफलक सूचक बनाने के लिए, सुरक्षित तरीकों में से एक की तरह CComPTR उपयोग करने के लिए है। मेरे पास एप्लिकेशन के लिए डीएलएल फ़ाइल नहीं है, इसलिए इस दृष्टिकोण को प्राथमिकता दी जाएगी। मेरी स्रोत फ़ाइल में #import "CANoe.tlb" के बाद निम्नलिखित संकलन त्रुटियां प्राप्त करना। - अज्ञात चरित्र '0x1' - वाक्यविन्यास त्रुटि: गायब ';' पहचानकर्ता 'ए' से पहले - गायब प्रकार विनिर्देशक - int मान लिया। नोट: सी ++ डिफ़ॉल्ट-int - '{': अनुपलब्ध फ़ंक्शन हेडर (पुरानी शैली औपचारिक सूची?) कृपया सुझाव दें, अगर मुझे कुछ कदम याद आ रहा है, तो कृपया सुझाव दें। क्या .tlb फ़ाइल सामग्री को सत्यापित करने और इन त्रुटियों को हल करने का कोई तरीका है। अग्रिम धन्यवाद –

+0

मेरा सुझाव है कि आप इसे हल करने का प्रयास करें और यदि आप प्रबंधित नहीं करते हैं तो पर्याप्त विवरण प्रदान करने के लिए एक अलग प्रश्न पूछें। – sharptooth

0

#include कथन का उपयोग करके आपकी .cpp फ़ाइल में .h और _i.c प्रोजेक्ट दोनों को शामिल करना आसान तरीका है।

चूंकि आपको डीएलएल नहीं दिया गया है और केवल टीएलबी प्रदान किया गया है, तो आप regtlibv12.exe का उपयोग कर tlb को पंजीकृत कर सकते हैं जो विजुअल स्टूडियो का हिस्सा है (यह वीएस2005 संस्करण है)। Tlb को पंजीकृत करके, रजिस्ट्री में उचित प्रविष्टियां की जाएंगी और फिर आपको COM लाइब्रेरी कार्यक्षमता का उपयोग करने की आवश्यकता हो सकती है।

संपादित करें: बीटीडब्ल्यू, आपको COM घटक को सफलतापूर्वक चालू करने के लिए किसी भी तरह डीएलएल की आवश्यकता है। त्वरित प्रतिक्रिया के लिए सभी को

 

CComPtr myPtr; 
myPtr.CoCreateInstance(__uuidof("ClassNamehere")); 
myPtr->Method(....); 

 
+0

यदि उसके पास डीएलएल नहीं है तो वह घटक को तुरंत चालू करने और अपने क्लाइंट प्रोग्राम को डीबग करने में असमर्थ होगा। – sharptooth

+0

हां, लेकिन यह काफी संभव है कि tlb फ़ाइल में केवल इंटरफ़ेस परिभाषाएं हों और उन्हें अलग से पंजीकृत करने की आवश्यकता हो। आप डीएलएल के बारे में सही हैं हालांकि उन्हें घटक को तुरंत चालू करना चाहिए। – Aamir

+0

ठीक है, आप अलग-अलग टीएलबी पंजीकरण के बारे में सही हैं। लेकिन यह आखिरी रिसॉर्ट अभ्यास आमतौर पर उपयोग किया जाता है जब COM घटक में अपूर्ण COM समर्थन होता है और DllRegisterServer और DllGetClassObject का समर्थन नहीं करता है। – sharptooth

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