2008-12-09 8 views
12

तो मेरे पास एक ऐसा एप्लिकेशन है जो QT API पर आधारित है जो QPlugin सिस्टम का उपयोग कर रहा है। इसका उपयोग करना काफी आसान है, आप एक कक्षा को परिभाषित करते हैं जो इंटरफेस से प्राप्त होता है और जब प्लगइन लोड होता है तो आपको उस वर्ग का एक उदाहरण मिलता है। अंत में यह dlopen/dlsym या LoadLibrary/GetProcAddress तक उबाल जाएगा, जो भी ओएस के लिए उपयुक्त है। मुझे यहां कोई समस्या नहीं है जो सबकुछ अपेक्षित काम करता है।प्लगइन एपीआई डिजाइन

तो, इस मुद्दे पर। कार्यक्षमता के बहुत है जिसमें मुख्य एप्लिकेशन द्वारा प्रदान किए गए डेटा/फ़ंक्शंस को संदर्भित करने के लिए आवश्यक प्लगइन शामिल है। उदाहरण के लिए, मेरे एप्लिकेशन में एक जीयूआई है, इसलिए मेरे पास मेरे एप्लिकेशन में "plugin::v1::gui" फ़ंक्शन है जो QWidget * देता है। अगर मैं अपने यूआई में चीजों को जोड़ने में सक्षम होने के लिए एक प्लगइन चाहता हूं, या यहां तक ​​कि इसके संवाद को मेरे यूआई के बच्चे को भी बना देता हूं तो उसे इसके लिए एक सूचक की आवश्यकता होगी।

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

अब मुझे पता चला है कि वहाँ विंडोज पर :(एक बराबर होने के लिए प्रकट नहीं होता है। तो क्या एक अच्छा समाधान अब तक सबसे अच्छा मैं ले कर आए हैं एक संरचना मैं हो रही है है?

मेरे मुख्य एप्लिकेशन में भरें जिसमें प्रत्येक ऑब्जेक्ट/फंक्शन के पॉइंटर्स हैं जिनके बारे में प्लगइन की परवाह हो सकती है। फिर प्लगइन के "init()" फ़ंक्शन में इसे पास करना और अब इसमें सबकुछ के लिए उचित पॉइंटर्स हैं, लेकिन अब यह एक परेशान समाधान है क्योंकि मुझे बनाना है जब भी मैं कुछ जोड़ता हूं तो कई स्थानों में परिवर्तन।

क्या कोई बेहतर समाधान है? एसओ समुदाय ने इसका सामना कैसे किया है?

उत्तर

4

मुख्य इंटरैक्शन ऑब्जेक्ट्स के लिए इंटरफेस का एक सेट बनाएं जो आपके एप्लिकेशन द्वारा उजागर किया जाएगा और उन्हें स्वयं के lib/dll में बनाया जाएगा और आपके आवेदन में कक्षाओं पर उन इंटरफ़ेस को उचित रूप से लागू करें। लाइब्रेरी में प्लगइन इंटरफ़ेस भी शामिल होना चाहिए, शायद प्लगइन ऑब्जेक्ट लागू करने वाली विधि "केवल" प्रारंभिक विधि के साथ।

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

इस सरल बनाने का एक लोकप्रिय तरीका आपके आवेदन में डीओएम के समान पदानुक्रम को कार्यान्वित करना है ताकि प्लगइन आपके आवेदन में सभी रूट ऑब्जेक्ट्स को रूट ऑब्जेक्ट से प्राप्त कर सके।

+0

यहां एक अच्छा आलेख है जो विस्तार से बताता है कि प्लगइन को इस तरीके से कैसे पूरा किया जाए: http://www.nuclex.org/articles/building-a-better-plugin-architecture#comment-738 – joshperry

0

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

वहाँ भी CORBA की तरह अधिक भारी वजन समाधान कर रहे हैं ...

+0

यह ज्यादातर * समान * मेरे "अब तक का सबसे अच्छा है ..." वाक्य के लिए। केवल वास्तविक अंतर यह है कि क्या वे संरचना तत्व या एक स्ट्रिंग पासिंग द्वारा अनुरोध करते हैं। सुरक्षा के कारण मैं उस पर संरचना ले जाऊंगा। –

+0

मैं समस्या के किसी भी अन्य समाधान की कल्पना नहीं कर सकता। इवान के बारे में आपने क्या सोचा? –

+0

दुर्भाग्य से, अब तक मुझे कुछ भी नहीं मिला जो वास्तव में बेहतर है। लिनक्स की गतिशीलता वास्तव में चिपकने के लिए अच्छा रहेगा। मैंने अपनी प्लगइन एपीआई को एक संरचना में परिवर्तित करना शुरू कर दिया है, और यह वास्तव में * सही होने के लिए समय लेने वाला है। –

0

आप किया है कि एक अपेक्षाकृत अच्छी तरह से। हेल्पर-क्लासेस अक्सर (केवल) नई कार्यक्षमता को शामिल करने का शुद्ध तरीका होता है। यदि आप अपने सॉफ्टवेयर को ताज़ा डिजाइन करते हैं तो आपको यह उल्लेख करना होगा कि प्रत्येक प्लगइन को आपके प्रशासनिक ढांचे तक पहुंच नहीं मिलनी चाहिए। तो प्लगइन-डिज़ाइन में अंतर होना चाहिए।

एक संभावना: कुछ अमूर्त वर्ग बनाएं जिन्हें आप प्राप्त करते हैं, जो कार्यक्षमता के साथ आपके आवश्यक पॉइंटर्स को विजेट या अन्य सेट करने के लिए आते हैं।

अन्य संभावना: getParent() के कार्यों के साथ अपने मुख्य (पैरेंट) कक्षाओं का विस्तार करें getMainWidget(), getParent() getConfigWidget() ....


तो इसके बारे में गतिशील रूप से ही है।। संकेत का उपयोग किए बिना अपने यूआई-प्लगइन से UI के लोड हो रहा है, तो आप इस पेज वर्णित के रूप में कर सकते हैं: http://dolzhenko.blogspot.com/2008/10/qt4-dynamic-loading-ui-from-other-ui_07.html

यह ui-फाइल्स साथ किया जाता है आप अपने मुख्य config-फाइल्स या जो कुछ भी से अधिक उपयोग कर सकते हैं।

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