2012-02-08 20 views
6

मैं विंडोज में एक डीएलएल लोड करने के लिए LoadLibrary फ़ंक्शन का उपयोग कर रहा हूं। मेरा सवाल यह है: यदि मैं एक ही डीएलएल के लिए इस विधि को एक से अधिक बार कॉल करता हूं, तो क्या मुझे डीएलएल के विभिन्न उदाहरणों के लिए हैंडल मिलती है, या क्या वे सभी एक ही उदाहरण का संदर्भ लेंगे?एक बार से अधिक डीएलएल लोड करें?

इसके अतिरिक्त, यह व्यवहार लिनक्स एसओ फाइलों से कैसे संबंधित है, क्या यह वही है या पूरी तरह से अलग है, और मैं इस संबंध में क्या धारणाएं कर सकता हूं? धन्यवाद।

+0

क्या आप अपने डीएलएल (और इसकी वैश्विक स्थिति) का एक अलग उदाहरण चाहते हैं? –

+0

@ डेविड हेफरन संभवतः, लेकिन केवल अगर यह लिनक्स में भी किया जा सकता है। मैं और अधिक चीजों को 'आम तौर पर' काम करने की कोशिश करने की कोशिश कर रहा हूं। यदि आप जो वर्णन करते हैं वह संभव है, तो मुझे यह जानने में दिलचस्पी होगी कि कैसे। –

+1

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

उत्तर

11

MSDN प्रलेखीकरण कहता है:

प्रणाली सभी लोड मॉड्यूल पर एक प्रति प्रक्रिया संदर्भ गिनती बनाए रखता है। कॉलिंग लोडब्रेरी संदर्भ गणना को बढ़ाता है। कॉलिंग फ्री लाइब्रेरी या फ्री लाइब्रेरी एंडएक्सिट थ्रेड फ़ंक्शन संदर्भ गणना को कम करता है। सिस्टम मॉड्यूल को अनलोड करता है जब इसकी संदर्भ संख्या शून्य तक पहुंच जाती है या जब प्रक्रिया समाप्त हो जाती है ( संदर्भ गणना के बावजूद)।

तो ऐसा लगता है कि मॉड्यूल को एक से अधिक बार लोड करना (फ्री लाइब्रेरी में कॉल मिलान किए बिना) एक ही हैंडल वापस कर देगा।

3

यदि डीएलएल पहले ही लोड हो चुका है, LoadLibrary बस स्मृति में लाइब्रेरी का पता वापस कर देगा। हालांकि, DllMain को दूसरे लोड का प्रयास करने पर DLL_PROCESS_ATTACH के साथ फिर से नहीं कहा जाता है। पुस्तकालयों की भावना में हैंडल केवल स्मृति स्थान हैं, इसलिए आपके द्वारा दूसरी बार प्राप्त होने वाला मान पहले जैसा ही होना चाहिए।

जहां तक ​​लिनक्स एसओ फाइलें जाती हैं, मुझे नहीं लगता कि वे दो बार क्यों लोड करेंगे। हालांकि, किसी और को आपको उचित उत्तर देने के लिए इस पर वजन करना होगा।

2

लिनक्स के लिए, वस्तुओं साझा dlopen(3) manpage से:

तो एक ही पुस्तकालय dlopen() के साथ फिर से भरी हुई है, एक ही फाइल संभाल दिया जाता है। dl पुस्तकालय के लिए पुस्तकालय हैंडल संदर्भ में गिना जाता है रखता है, ताकि एक गतिशील पुस्तकालय पुनः आवंटित की जाती नहीं है जब तक dlclose()dlopen() के रूप में उस पर रूप में कई बार बुलाया गया है यह पर सफल रहा है। _init() दिनचर्या, यदि मौजूद है, तो केवल कहा जाता है। लेकिन RTLD_NOW के साथ एक बाद की कॉल लाइब्रेरी के लिए प्रतीक संकल्प को मजबूर कर सकती है जो पहले RTLD_LAZY से लोड की गई थी।

+0

यह प्रति प्रक्रिया या सभी प्रक्रियाओं के लिए है? – g19fanatic

+0

@ g19fanatic - एक ही प्रक्रिया के लिए। – cha0site

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