मेरा पहला विचार यह है कि, यदि आप स्थिर रूप से एक डीएलएल को जोड़ रहे हैं, तो यह एक प्लगइन नहीं है। बस EXE फ़ोल्डर में डीएल डालें और इसके साथ किया जाए। यह स्थिर रूप से लोड डीएलएल के लिए विंडोज़ द्वारा समर्थित तैनाती विन्यास है।
उस ने कहा, आप जो चाहते हैं उसे प्राप्त करने के तरीके हैं। लेकिन वे ज्यादातर बेवकूफ, या कोई अच्छे कारण के लिए जटिल हैं: आपके विकल्प हैं:
- स्थिर लिंक न करें। प्लग इन सामग्री का उपयोग करने की LoadLibrary ("plugins/Plugin.dll") & GetProcAddress का प्रयोग करें।
- सिस्टम पथ वातावरण चर करने के लिए "अपने प्लग-इन फ़ोल्डर के लिए पथ" जोड़ें।
- प्लगइन्स कार्यक्षमता तक पहुँचने में देरी करने के देरी लोड तंत्र का उपयोग करें, एक प्रदान की पथ का उपयोग कर एक custom helper function कि dll (रों) लोड कर सकते हैं निर्धारित किया है।
(कि plugin.dll सूचीबद्ध करता है उस में एक .manifest फ़ाइल बनाने के द्वारा) मुड़ें
- प्लगइन्स एक विधानसभा में फ़ोल्डर। अपने ऐप पर एक निर्भर असेंबली के रूप में "प्लगइन्स" जोड़ें। अब यह प्लगइन्स फ़ोल्डर में दिखेगा।
- एक ठूंठ exe में अपने आवेदन और एक गतिशील लोड हिस्सा विभाजित करें। ठूंठ exe कॉल SetDllDirectory प्लगइन फ़ोल्डर को इंगित करने के लिए, तो LoadLibrary पूरा पथ "appstub.dll" करने के लिए गुजर कहते हैं।
एक फ़ोल्डर चालू करने के लिए एक या अधिक dll के साथ में एक "विधानसभा", बस फ़ोल्डरों name.manifest साथ फ़ोल्डर में एक फ़ाइल जोड़ें।
तो, plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
यह एक बहुत अच्छा विचार है सुनिश्चित करने के लिए कि फ़ोल्डर और dll का नाम अलग है के रूप में यदि dll नाम विधानसभा नाम खिड़कियां है इसके एम्बेडेड को देख शुरू होता है असेंबली के बारे में जानकारी के लिए प्रकट फ़ाइल।
मान लिया जाये कि आप दृश्य स्टूडियो 7 या उसके बाद का उपयोग कर रहे, निम्नलिखित निर्देश एक ग/सीपीपी या करने के लिए जोड़ा।
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
स्रोत
2010-09-30 15:57:08
धन्यवाद - मैं अब GetProcAddress दृष्टिकोण के साथ गया हूं क्योंकि मुझे पता नहीं लगा कि मैनिफेस्ट को "फर्जी असेंबली" दृष्टिकोण कैसे काम करना है। सौभाग्य से, यह समग्र वास्तुकला के साथ अच्छी तरह से काम करता है। – Oliver
आपको देरी लोडिंग के लिए 'SetDllDirectory' की आवश्यकता नहीं है; वहाँ '__pfnDliNotifyHook2' हुक है ताकि आप 'LoadLibrary ("। \\ plugins \\ PluginX.dll ") को सीधे कॉल कर सकें। '% पाथ%' विचार थोड़ा नाजुक है क्योंकि यह जांचने के लिए स्थानों की सूची पर कम है। – MSalters
धन्यवाद। मैंने व्यक्तिगत रूप से देरी लोडिंग का व्यक्तिगत रूप से उपयोग नहीं किया है, इसलिए मैंने अभी माना है कि SetDllDirectory इसे ट्यून करने का तरीका होगा। –