2013-07-02 11 views
5

मैं सी के "छिपा/अंधेरी जगहों" करने के लिए नया हूँ ++ और मैं सोच रहा था एक अलग निर्देशिका या एक के अंदर किसी उप-निर्देशिका से एक .dll फ़ाइल को लोड करने के लिए कैसे जहां मेरे वर्तमान निष्पादनसी ++ एक उपनिर्देशिका से डीएलएल लोड करें?

पूर्व से चल रहा है :

./MyAppDirectory 
    /MyApp.exe 
    /SomeDLL.dll 
    /AnotherDLL.dll 
    /SubDirectory 
    /SomeDLL2.dll 
    /AnotherDLL2.dll 
    /YetAnotherDLL.dll 
    /... 

तो "MyApp.exe" स्वचालित रूप से "SomeDLL.dll" और "AnotherDLL.dll" से यह रूट फ़ोल्डर "MyAppDirectory" है लेकिन मैं भी "SomeDLL2.dll" लोड करने में सक्षम होना चाहता हूँ लोड करता है, " "MyAppDirectory" फ़ोल्डर के अंदर "SubDirectory" फ़ोल्डर से एक और DLL2.dll "," YetAnotherDLL.dll "आदि।

मैं कुछ खोज करने के किया गया है और मैं क्या मिल गया है से केवल समाधान हैं:

  • 1) निष्पादन की कार्यशील निर्देशिका को संशोधित करें।
  • 2) डीएलएल फ़ाइलों को विंडोज रूट के अंदर रखें।
  • 3) पाथ पर्यावरण चर को संशोधित करें।

लेकिन उनमें से सभी के पास कुछ बुरे पक्ष हैं (यहां उल्लेख करने लायक नहीं है) और यह वास्तव में मुझे आवश्यकता नहीं है। एक और समाधान "आवेदन विशिष्ट पथ" के माध्यम से है! जिसमें विंडोज रजिस्ट्री के साथ काम करना शामिल है और पहले उल्लेख किया गया है तो थोड़ा बेहतर लगता है।

हालांकि मुझे बाहरी विधियों का उपयोग किए बिना सी ++ का उपयोग करके "MyApp.exe" के अंदर ऐसा करने में सक्षम होना चाहिए।

मैं मिनीजीडब्ल्यू 4.7.2 का उपयोग कर रहा हूं और मेरा आईडीई कोड :: ब्लॉक 12.11 भी है, मेरा ओएस विंडोज एक्सपी एसपी 3 प्रो x86 है।

कोई संदर्भ, ट्यूटोरियल, प्रलेखन, उदाहरण आदि स्वीकार किया जाता है और अपने समय के लिए धन्यवाद: आप

LoadLibrary("subFolder\\dynamicLibrary.dll"); 

DLLs को स्पष्ट लिंक भी होता है का उपयोग करना चाहिए डी

+0

आपकी सभी तीन आइटम सूची खराब विचार हैं। उनमें से कोई भी मत करो। –

+0

संभावित डुप्लिकेट [स्थिर लिंक किए गए डीएलएल के लिए डीएलएल खोज पथ को बदलना] (http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – MSalters

उत्तर

2

आप स्पष्ट रूप से DLL नहीं लोड हो रहे हैं ("मैन्युअल", अपने कोड LoadLibrary(...) का उपयोग करने में), तो आप जो Windows DLL के लिए दिखेगा एक जगह में .dll करना होगा, whihc काफी का अर्थ आपके प्रश्न में तीन विकल्पों में से आप बात कर रहे हैं।

LoadLibrary का उपयोग करते समय, आप DLL के लिए एक सापेक्ष या पूर्ण पथ निर्दिष्ट कर सकते हैं।

ध्यान दें कि यह DLL के स्पष्ट रूप से और परोक्ष लोड करने के लिए पूरी तरह से अलग है - स्पष्ट मामले में, आप LoadLibrary का उपयोग करें, और उसके बाद GetProcAddress का उपयोग समारोह का पता लगाने के लिए है, और आप समारोह संकेत का उपयोग करने के लिए कॉल करना होगा फ़ंक्शंस - यह आमतौर पर केवल प्लग-इन या इसी तरह की कार्यक्षमता के लिए उपयोग किया जाता है जहां डीएलएल एक छोटी संख्या में फ़ंक्शंस प्रदान करता है (अक्सर एक सामान्य इंटरफ़ेस क्लास वाले कुछ करने के लिए ऑब्जेक्ट बनाने के लिए केवल एक फ़ैक्टरी फ़ंक्शन होता है, और प्रत्येक डीएलएल में होता है ऐसा करने के लिए एक ऑब्जेक्ट बनाने के लिए एक ही प्रकार का फ़ंक्शन जो कुछ भी करना है)।

निहित भार में, आपको डीएलएल का उपयोग करने के लिए अपने कोड में कुछ भी करने की आवश्यकता नहीं है, और डीएलएल के कार्यों को ऐसा लगता है कि वे एप्लिकेशन में कड़ी से जुड़े हुए थे।

+0

विस्तारित उत्तर के लिए आपको बहुत बहुत धन्यवाद, जिसने मेरे प्रश्न का उत्तर दिया: डी –

+0

यदि यह आपके प्रश्न का उत्तर देता है, तो कृपया इसे इस तरह चिह्नित करें। –

+0

गलती के लिए खेद है। मैं आपके उत्तर पर आगे दस्तावेज करते समय किसी के द्वारा विचलित था और पुष्टि करने के लिए भूल गया। –

0

, यह थोड़ा की तुलना में मुश्किल है अंतर्निहित जोड़ने (मुझे लगता है कि यह तुम क्या प्रयोग कर रहे हैं है), लेकिन मुझे विश्वास है कि यह अपने उद्देश्य को प्राप्त करने के लिए सही तरीका है

explicit

implicit

+0

क्या यह विधि एमएसवीसी के लिए विशिष्ट है या मैं इसे अन्य कंप्यूटर्स जैसे मिनजीडब्ल्यू (जीसीसी) में उपयोग कर सकता हूं? –

+0

यह एक WinAPI है, इसलिए आप प्रत्येक कंपाइलर में उपयोग कर सकते हैं, आपको बस शामिल करना होगा और Kernel32.lib लिंक करें जाहिर है यह केवल विंडोज –

+0

नंबर में काम करता है। आपको एक पूर्ण पथ का उपयोग करना चाहिए। –

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