2010-08-16 17 views
19

यदि मैं एक ही डीएलएल को लगातार 3 बार लोड करने के लिए Win32 API लोड लाइब्रेरी का उपयोग करता हूं तो उसे 3 अलग-अलग हैंडल लौटाएंगे और प्रत्येक लाइब्रेरी में फ़ंक्शंस को अलग-अलग पते सही होंगे? (या यह कुछ "स्मार्ट" करता है और पता लगाता है कि क्या डीएलएल पहले से ही प्रक्रिया के लिए लोड हो चुका है और बस उसी मॉड्यूल को इंगित करता है?)क्या लोड लाइब्रेरी विशिष्ट उदाहरण बनाती है?

उत्तर

21

यह कुछ स्मार्ट करता है। विंडोज लोडलोडर के माध्यम से लोड प्रत्येक डीएलएल के लिए संदर्भ संख्या रखता है। यही कारण है कि आपको प्रत्येक संबंधित लोड लाइब्रेरी कॉल के लिए एक बार फ्री लाइब्रेरी को कॉल करना होगा। मान लें कि आप पहले डीएलएल को मुक्त नहीं करते हैं, लोड लाइब्रेरी में प्रत्येक कॉल आपको एक ही संभाल देगा।

FreeLibrary के लिए MSDN प्रलेखीकरण से:

प्रत्येक प्रक्रिया प्रत्येक लोड पुस्तकालय मॉड्यूल के लिए एक संदर्भ गिनती बनाए रखता है। जब भी लोड लाइब्रेरी बुलाया जाता है और हर बार फ्री लाइब्रेरी कहलाता है तो यह संदर्भ गणना बढ़ जाती है।

+8

ध्यान दें कि यदि आप एक ही डीएलएल को हल करने वाले विभिन्न पथों का उपयोग करते हैं तो कई उदाहरण प्राप्त करना संभव है, लेकिन अधिकांश लोग इसमें भाग नहीं लेते हैं। – Michael

+0

अच्छा पकड़ो। धन्यवाद, माइकल। –

+1

मेरी सामान्य नीति फ्री लाइब्रेरी को कभी भी कॉल नहीं करना है। यह जानना अच्छा होता है कि उपयोगकर्ता आवश्यकतानुसार अधिक लीक किए बिना लोड लाइब्रेरी को कई बार कॉल कर सकता है। (एप्लिकेशन टर्मिनेशन से पहले आप वास्तव में लाइब्रेरी को कितनी बार अनलोड करना चाहते हैं? जोखिम मूल्य से अधिक है)। – CashCow

6

यदि वे एक ही डीएलएल हैं, तो यह फिर से लोड नहीं होगा।

http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

"निर्दिष्ट मॉड्यूल एक DLL कि पहले से ही बुला प्रक्रिया के लिए लोड नहीं है है, तो सिस्टम DLL_PROCESS_ATTACH मूल्य के साथ DLL के DllMain फ़ंक्शन को कॉल। DllMain सही देता है, तो LoadLibrary करने के लिए एक संभाल रिटर्न मॉड्यूल। यदि DllMain FALSE लौटाता है, तो सिस्टम प्रक्रिया पता स्थान से DLL को अनलोड करता है और लोड लाइब्रेरी शून्य देता है। DllMain से LoadLibrary को कॉल करना सुरक्षित नहीं है। अधिक जानकारी के लिए, DllMain में टिप्पणियां अनुभाग देखें। "

"यदि एलपीफ़ाइलनाम में पथ शामिल नहीं है और उसी आधार नाम और एक्सटेंशन के साथ एक से अधिक लोड मॉड्यूल हैं, तो फ़ंक्शन पहले लोड किए गए मॉड्यूल में एक हैंडल देता है।"

3

नहीं, ऐसा नहीं है। इसके आस-पास पहुंचने के लिए, आप .dll को एक अस्थायी फ़ाइल में कॉपी कर सकते हैं (जितनी बार आपको .dll लोड करने की आवश्यकता होती है) और फिर एक बार पूरा होने के बाद फ़ाइलों को हटा दें।

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