Qt 5.11 - Using ActiveX controls and COM in Qt

ActiveX नियंत्रणों का उपयोग करना और Qt में COM




qt

ActiveX नियंत्रणों का उपयोग करना और Qt में COM

QAxContainer मॉड्यूल ActiveQt ढांचे का हिस्सा है। यह एक QWidget उपवर्ग, QAxWidget लागू करने वाला एक पुस्तकालय प्रदान करता है, जो ActiveX नियंत्रणों के लिए एक कंटेनर और एक QObject उपवर्ग, QAxObject रूप में कार्य करता है, QAxObject उपयोग गैर-विज़ुअल COM ऑब्जेक्ट को आसानी से करने के लिए किया जा सकता है। इन कक्षाओं का उपयोग करके एम्बेडेड COM ऑब्जेक्ट्स को स्क्रिप्ट करना QAxScript , QAxScriptManager और QAxScriptEngine कक्षाओं के माध्यम से संभव है, और tools का एक सेट प्रोग्राम को COM ऑब्जेक्ट तक पहुंचने में आसान बनाता है।

मॉड्यूल छह वर्गों के होते हैं

  1. QAxBase एक QAxBase क्लास है जो COM ऑब्जेक्ट या ActiveX कंट्रोल को इनिशियलाइज़ और एक्सेस करने के लिए एक एपीआई प्रदान करता है।
  2. QAxObject एक QAxObject प्रदान करता है जो COM ऑब्जेक्ट को लपेटता है।
  3. QAxWidget एक QWidget जो एक ActiveX नियंत्रण को लपेटता है।
  4. QAxScriptManager , QAxScript और QAxScriptEngine विंडोज स्क्रिप्ट होस्ट को एक इंटरफ़ेस प्रदान करते हैं।

उच्च-स्तरीय उपयोगकर्ता इंटरफ़ेस कार्यक्षमता प्रदान करने के लिए मानक ActiveX नियंत्रणों का उपयोग करने वाले कुछ उदाहरण अनुप्रयोग प्रदान किए जाते हैं।

विषय:

लाइब्रेरी का उपयोग करना

COM ऑब्जेक्ट और ActiveX नियंत्रण को होस्ट कर सकने वाले Qt अनुप्रयोगों का निर्माण करने के लिए QAxContainer मॉड्यूल के साथ एप्लिकेशन को जोड़कर लिंक करें

QT += axcontainer

आपके आवेदन की .pro फ़ाइल के लिए।

वितरण QAxContainer अनुप्रयोग

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

COM ऑब्जेक्ट्स को त्वरित करना

किसी COM ऑब्जेक्ट को QAxBase::setControl करने के लिए QAxBase::setControl () API का उपयोग करें, या जिस ऑब्जेक्ट का आप उपयोग कर रहे हैं, उसका नाम सीधे QAxBase उपवर्ग के निर्माता के पास करें।

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

विशिष्ट त्रुटि संदेश

जब यह रनटाइम में त्रुटि स्थितियों का सामना करता है, तो ActiveQt डिबग आउटपुट में त्रुटि संदेश प्रिंट करता है। आमतौर पर इन संदेशों को देखने के लिए आपको डिबगर में अपना प्रोग्राम चलाना चाहिए (उदाहरण के लिए Visual Studio का डीबग आउटपुट)।

अनुरोधित नियंत्रण त्वरित नहीं किया जा सका

QAxBase::setControl () में अनुरोधित नियंत्रण इस प्रणाली पर स्थापित नहीं है, या वर्तमान उपयोगकर्ता के लिए सुलभ नहीं है।

नियंत्रण के लिए व्यवस्थापक अधिकार, या लाइसेंस कुंजी की आवश्यकता हो सकती है। यदि नियंत्रण को लाइसेंस दिया गया है, तो QAxBase::setControl को दस्तावेज के रूप में लाइसेंस कुंजी पास करें।

ऑब्जेक्ट API तक पहुँचना

ActiveQt COM ऑब्जेक्ट को Qt API प्रदान करता है, और COM डेटाटाइप्स को Qt समकक्षों के साथ बदलता है।

COM वस्तु पर API को कॉल करने के चार तरीके हैं:

  • C ++ नाम स्थान बनाना
  • कॉल-टू-नाम से
  • एक स्क्रिप्ट इंजन के माध्यम से
  • देशी COM इंटरफेस का उपयोग करना

एक C ++ नाम स्थान बनाना

आप जिस प्रकार की लाइब्रेरी तक पहुंचना चाहते हैं, उसके लिए C ++ नेमस्पेस उत्पन्न करने के लिए dumpcpp टूल का उपयोग करें। इस उपकरण को मैन्युअल रूप से उस प्रकार की लाइब्रेरी पर चलाएं जिसे आप उपयोग करना चाहते हैं, या अपने ऐप्लिकेशन की .pro फ़ाइल में TYPELIBS चर में टाइप लाइब्रेरी जोड़कर इसे बिल्ड सिस्टम में एकीकृत करें .pro

TYPELIBS = file.tlb

ध्यान दें कि dumpcpp , प्रकार पुस्तकालय में सभी एपीआई को उजागर करने में सक्षम नहीं हो सकता है।

उत्पन्न सी ++ कक्षाओं के माध्यम से ऑब्जेक्ट एपीआई तक पहुंचने के लिए अपने कोड में परिणामी हेडर फ़ाइल शामिल करें। अधिक जानकारी के लिए Qutlook उदाहरण देखें।

कॉल के नाम

QAxBase::dynamicCall () और QAxBase::querySubObject () के साथ-साथ QObject::setProperty () और QObject::property () API को उनके नाम के माध्यम से COM ऑब्जेक्ट के तरीकों और गुणों को कॉल करने के लिए उपयोग करें। किसी भी COM ऑब्जेक्ट और उसके dumpdoc के लिए क्यूटी एपीआई के दस्तावेज प्राप्त करने के लिए dumpdoc टूल का उपयोग करें; ध्यान दें कि COM ऑब्जेक्ट के सभी API उपलब्ध नहीं हो सकते हैं।

अधिक जानकारी के लिए मीडिया प्लेयर उदाहरण देखें।

स्क्रिप्ट इंजन के माध्यम से फंक्शन कॉल करना

Qt एप्लिकेशन सिस्टम पर स्थापित किसी भी ActiveScript इंजन की मेजबानी कर सकता है। स्क्रिप्ट इंजन फिर स्क्रिप्ट कोड चला सकता है जो COM ऑब्जेक्ट तक पहुंचता है।

स्क्रिप्ट इंजन को तुरंत करने के लिए, QAxScriptManager::addObject () का उपयोग उन COM वस्तुओं को पंजीकृत करने के लिए करें जिन्हें आप स्क्रिप्ट से एक्सेस करना चाहते हैं, और इंजन में स्क्रिप्ट कोड को लोड करने के लिए QAxScriptManager::load () लोड करें। फिर QAxScriptManager::call () या QAxScript::call () का उपयोग करके स्क्रिप्ट फ़ंक्शन को QAxScriptManager::call QAxScript::call

COM ऑब्जेक्ट के कौन से API स्क्रिप्टिंग के माध्यम से उपलब्ध हैं, इसका उपयोग स्क्रिप्ट भाषा पर निर्भर करता है।

ActiveX टेस्ट कंटेनर स्क्रिप्ट फ़ाइलों की लोडिंग प्रदर्शित करता है।

देशी COM इंटरफेस का उपयोग करके एक फ़ंक्शन कॉल करना

COM ऑब्जेक्ट के फ़ंक्शन को कॉल करने के लिए जो उपरोक्त विधियों में से किसी के माध्यम से एक्सेस नहीं किया जा सकता है, QAxBase::queryInterface () का उपयोग करके सीधे COM इंटरफ़ेस का अनुरोध करना संभव है। संबंधित इंटरफ़ेस वर्गों की C ++ परिभाषा प्राप्त करने के लिए नियंत्रण के साथ प्रदान की गई लाइब्रेरी के साथ #import निर्देश का उपयोग करें; विवरण के लिए अपना कंपाइलर मैनुअल देखें।

विशिष्ट त्रुटि संदेश

जब यह रनटाइम में त्रुटि स्थितियों का सामना करता है, तो ActiveQt डिबग आउटपुट में त्रुटि संदेश प्रिंट करता है। आमतौर पर इन संदेशों को देखने के लिए आपको डिबगर में अपना प्रोग्राम चलाना चाहिए (उदाहरण के लिए Visual Studio का डीबग आउटपुट)।

QAxBase :: internalInvoke: ऐसी कोई विधि नहीं है

एक QAxBase::dynamicCall () विफल रहा - फ़ंक्शन प्रोटोटाइप ऑब्जेक्ट के एपीआई में उपलब्ध किसी भी फ़ंक्शन से मेल नहीं खाता।

IDispatch सदस्य को कॉल करने में त्रुटि: गैर-वैकल्पिक पैरामीटर गायब है

एक QAxBase::dynamicCall () विफल रहा - फ़ंक्शन प्रोटोटाइप सही था, लेकिन बहुत कम पैरामीटर प्रदान किए गए थे।

IDispatch सदस्य को कॉल करने में त्रुटि: पैरामीटर n में बेमेल टाइप करें

एक QAxBase::dynamicCall () विफल रहा - फ़ंक्शन प्रोटोटाइप सही था, लेकिन इंडेक्स n पर पैरामीटर गलत प्रकार का था और इसे सही प्रकार के लिए ज़ब्त नहीं किया जा सकता था।

QAxScriptManager :: call (): कोई स्क्रिप्ट इस फ़ंक्शन को प्रदान नहीं करता है

आप एक ऐसे फ़ंक्शन को कॉल करने का प्रयास करते हैं जो इंजन के माध्यम से प्रदान किया जाता है जो आत्मनिरीक्षण प्रदान नहीं करता है (यानी। ActivePython या ActivePerl )। आपको संबंधित QAxScript ऑब्जेक्ट पर फ़ंक्शन को सीधे कॉल करने की आवश्यकता है।

ActiveQt भी देखें