2008-09-04 15 views
44

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

चलो व्यावहारिक हो, और सी ++ मानक छोड़ दें, जो इस संबंध में एक मिनट के लिए बहुत उपयोगी नहीं है। यदि मैं विंडोज और मैक (और वैकल्पिक रूप से लिनक्स) के लिए एक ऐप लिखना चाहता हूं जो सी ++ प्लग-इन का समर्थन करता है, और यदि मैं प्लग-इन लेखकों को संकलकों की एक बड़ी पसंद पसंद करना चाहता हूं (विज़ुअल सी ++ के 2 साल से कम पुराने संस्करणों को कहें , जीसीसी या इंटेल के सी ++ कंपाइलर), सी ++ की कौन सी विशेषताएं मैं गिन सकता हूं?

बेशक, मुझे लगता है कि प्लग-इन एक विशिष्ट मंच के लिए लिखा जाएगा।

मेरे सिर के ऊपर बंद, यहाँ, कुछ सी ++ सुविधाओं मैं के बारे में सोच सकते हैं क्या मुझे लगता है कि के साथ जवाब है:

  • vtable लेआउट, सार कक्षाओं के माध्यम से वस्तुओं का उपयोग करने के? (हाँ)
  • अंतर्निहित प्रकार, पॉइंटर्स? (हाँ)
  • structs, संघों? (हाँ)
  • अपवाद? (नहीं)
  • बाहरी "सी" फ़ंक्शन? (हाँ)
  • अंतर्निहित पैरामीटर प्रकारों के साथ stdcall गैर-बाहरी "सी" फ़ंक्शन? (हाँ)
  • उपयोगकर्ता द्वारा परिभाषित पैरामीटर प्रकारों के साथ गैर-स्टडकॉल गैर-बाहरी "सी" फ़ंक्शन? (नहीं)

मैं उस क्षेत्र में आपके किसी भी अनुभव की सराहना करता हूं जिसे आप साझा कर सकते हैं। यदि आप किसी भी मामूली सफल ऐप के बारे में जानते हैं जिसमें सी ++ प्लग-इन सिस्टम है, तो यह भी अच्छा है।

कार्ल

उत्तर

25

डॉ डॉब के जर्नल में एक लेख Building Your Own Plugin Framework: Part 1 जो इस विषय पर बहुत अच्छी पढ़ने है। यह लेखों की एक श्रृंखला की शुरुआत है जो सी/सी ++ क्रॉस-प्लेटफार्म प्लगइन ढांचे के आर्किटेक्चर, विकास और तैनाती को शामिल करता है।

+3

यह उत्तर बेहतर होगा यदि आपने "यहां" लिंक को थोड़ा और वर्णनात्मक बना दिया है। अभी, आप यह नहीं बता सकते कि आप क्या जोड़ रहे हैं। –

+1

टिप के लिए धन्यवाद!प्वाइंट – Serge

1

मेरे पास मेरा अपना गेम इंजन है जिसमें सी ++ प्लग-इन सिस्टम है।

मेरे पास हेडर फाइलों में कुछ कोड है, इसलिए इसे प्लगइन की संकलन इकाई में डाल दिया जाता है।

मुख्य इंजन में रहने वाले बड़े कार्यों को एक निर्यातित सी फ़ंक्शन के माध्यम से बुलाया जाता है (प्लगइन MyObject_somefunction (MyObject * obj) कॉल करता है जो इंजन में केवल obj-> somefunction()) को कॉल करता है।

#if defined(IN_THE_PLUGIN) 
void MyObject::somefunction() { MyObject_somefunction(this); } 
#endif 

आभासी कार्यों या तो करने के लिए है: यदि एक सी समारोह बुला अपने स्वाद के लिए बदसूरत है, तो कुछ हैडर प्रवंचना, जब हैडर प्लगइन में शामिल है के साथ, सदस्य समारोह सी समारोह कॉल करने के लिए #defined है शुद्ध हो या कोड हेडर फ़ाइल में रहता है। यदि मैं कक्षा से विरासत में नहीं हूं और केवल एक को इंस्टेंस कर रहा हूं, तो वर्चुअल फ़ंक्शन कोड इंजन में रह सकता है, लेकिन फिर कक्षा को प्लगइन से बुलाए गए ऑब्जेक्ट को बनाने और नष्ट करने के लिए कुछ सी फ़ंक्शंस निर्यात करना होगा।

मूल रूप से, मैंने जो चालें उपयोग की हैं, कुल लक्ष्य स्वतंत्रता बनाए रखने के लक्ष्य के साथ, केवल सी निर्यात और हेडर फ़ाइल चाल की मात्रा है।

6

आप पारंपरिक प्लगइन इंटरफ़ेस को एक स्क्रिप्टिंग इंटरफ़ेस द्वारा प्रतिस्थापित करने पर भी विचार करना चाहेंगे। सी/सी ++ में कई स्क्रिप्टिंग भाषाओं के लिए कुछ बहुत अच्छी बाइंडिंग हैं जो आपकी समस्या को हल कर चुके हैं। उनमें से शीर्ष पर निर्माण करना एक बुरा विचार नहीं हो सकता है। उदाहरण के लिए, Boost.Python पर एक नज़र डालें।

+0

ले लिया गया है यदि आप इसके लिए जा रहे हैं, तो मैं कहूंगा कि लुआ एक बेहतर फिट है, क्योंकि सी ++ के साथ एकीकृत करना बहुत आसान है और यह अधिक हल्का है। –

+1

उस ने कहा, कुछ ऐसे समय हैं जहां स्क्रिप्टिंग बस पर्याप्त नहीं है - खासकर यदि आप उन प्लगइन को अनुमति देना चाहते हैं जिनके पास ऑपरेटिंग सिस्टम तक पहुंच है। –

3

मुझे लगता है कि आप के आधार पर एक प्लगइन प्रणाली बनाने सुरक्षित हैं:

  • (.so, .dll, आदि) पुस्तकालय में प्लगइन कार्यक्षमता की पैकेजिंग
  • की आवश्यकता होती है कि प्लगइन का पर्दाफाश कुंजी सी भाषा निर्यात।
  • यह आवश्यक है कि प्लगइन लागू करें (और एक सूचक/संदर्भ को वापस करें) एक सार C++ इंटरफ़ेस।

शायद सबसे सफल सी ++ प्लगइन सिस्टम: अच्छा पुराना Adobe Photoshop। और यदि ऐसा नहीं है, तो VSTi आदि जैसे वर्चुअल synth प्रारूपों में से एक

3

पुस्तक Imperfect C++ by Matthew Wilson इस बारे में अच्छी जानकारी है।

ऐसा लगता है कि जब तक आप एक ही (या समतुल्य) कंपाइलर का उपयोग करते हैं, तो आप सी ++ का उपयोग कर सकते हैं, अन्यथा आप सी को अपने सी ++ कोड के शीर्ष पर इंटरफ़ेस के रूप में उपयोग करने के बेहतर हैं।

+0

सलाह के लिए धन्यवाद - मैं उस शीर्षक में इतनी बार आया हूं कि मैं आगे बढ़ गया और इस बार इसे खरीदा। –

5

Qt में प्लगइन के लिए एक बहुत अच्छी प्रणाली है जिसे मैंने अतीत में उपयोग किया है। यह सी ++ प्लगइन्स विकसित करने की कोशिश करते समय आमतौर पर मिली कई समस्याओं को दूर करने के लिए क्यूटी की मेटा-ऑब्जेक्ट सिस्टम का उपयोग करता है।

एक उदाहरण यह है कि एक असंगत प्लगइन का उपयोग करने से रोकने के लिए Q_DECLARE_INTERFACE काम करता है। यह सुनिश्चित करने के लिए कि आप अपने आर्किटेक्चर, ओएस, कंपाइलर के लिए सही प्लगइन लोड करते हैं, build key है। यदि आप क्यूटी की प्लगइन प्रणाली का उपयोग नहीं करते हैं, तो ये चीजें हैं जिनके बारे में आपको चिंता करना होगा और स्वयं के लिए समाधान खोजना होगा। यह जरूरी नहीं है कि रॉकेट साइंस, और मैं यह नहीं कह रहा हूं कि आप इसमें असफल हो जाएंगे, लेकिन ट्रॉल्टेक के लोग बहुत स्मार्ट हैं और इसके बारे में सोचने में थोड़ी देर बिताई है, और मैं अपने पहिये को फिर से शुरू करने के बजाय जो भी बनाया है उसका उपयोग करना चाहता हूं ।

एक और उदाहरण है कि आम तौर पर RTTI DLL सीमाओं के पार काम नहीं करता है, लेकिन जब क्यूटी का उपयोग कर, qobject_cast तरह बातें जो मेटा-वस्तु प्रणाली पर भरोसा करते हैं DLL सीमाओं के पार काम करते हैं।

2

फ़ायरफ़ॉक्स चलाता है बाहर की जाँच का सुझाव देते हैं। यह माइक्रोसॉफ्ट COM द्वारा प्रेरित है लेकिन यह multiplatform है।

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