तो मेरे पास एक ऐसा एप्लिकेशन है जो QT API पर आधारित है जो QPlugin सिस्टम का उपयोग कर रहा है। इसका उपयोग करना काफी आसान है, आप एक कक्षा को परिभाषित करते हैं जो इंटरफेस से प्राप्त होता है और जब प्लगइन लोड होता है तो आपको उस वर्ग का एक उदाहरण मिलता है। अंत में यह dlopen
/dlsym
या LoadLibrary
/GetProcAddress
तक उबाल जाएगा, जो भी ओएस के लिए उपयुक्त है। मुझे यहां कोई समस्या नहीं है जो सबकुछ अपेक्षित काम करता है।प्लगइन एपीआई डिजाइन
तो, इस मुद्दे पर। कार्यक्षमता के बहुत है जिसमें मुख्य एप्लिकेशन द्वारा प्रदान किए गए डेटा/फ़ंक्शंस को संदर्भित करने के लिए आवश्यक प्लगइन शामिल है। उदाहरण के लिए, मेरे एप्लिकेशन में एक जीयूआई है, इसलिए मेरे पास मेरे एप्लिकेशन में "plugin::v1::gui
" फ़ंक्शन है जो QWidget *
देता है। अगर मैं अपने यूआई में चीजों को जोड़ने में सक्षम होने के लिए एक प्लगइन चाहता हूं, या यहां तक कि इसके संवाद को मेरे यूआई के बच्चे को भी बना देता हूं तो उसे इसके लिए एक सूचक की आवश्यकता होगी।
मैंने लिनक्स पर विकास शुरू किया और जल्दी ही इस तथ्य का सामना किया कि डिफ़ॉल्ट रूप से लोडर इसे साझा करने वाले एप्लिकेशन से साझा वस्तुओं में अनसुलझे प्रतीकों को भरता नहीं है। कोई समस्या नहीं, आसान फिक्स। मेरे झंडे में "-rdynamic
" जोड़ें और आगे बढ़ें। चीज अच्छी तरह से काम करते हैं।
अब मुझे पता चला है कि वहाँ विंडोज पर :(एक बराबर होने के लिए प्रकट नहीं होता है। तो क्या एक अच्छा समाधान अब तक सबसे अच्छा मैं ले कर आए हैं एक संरचना मैं हो रही है है?
मेरे मुख्य एप्लिकेशन में भरें जिसमें प्रत्येक ऑब्जेक्ट/फंक्शन के पॉइंटर्स हैं जिनके बारे में प्लगइन की परवाह हो सकती है। फिर प्लगइन के "init()
" फ़ंक्शन में इसे पास करना और अब इसमें सबकुछ के लिए उचित पॉइंटर्स हैं, लेकिन अब यह एक परेशान समाधान है क्योंकि मुझे बनाना है जब भी मैं कुछ जोड़ता हूं तो कई स्थानों में परिवर्तन।
क्या कोई बेहतर समाधान है? एसओ समुदाय ने इसका सामना कैसे किया है?
यहां एक अच्छा आलेख है जो विस्तार से बताता है कि प्लगइन को इस तरीके से कैसे पूरा किया जाए: http://www.nuclex.org/articles/building-a-better-plugin-architecture#comment-738 – joshperry