2009-11-17 16 views
6

मैं अपने स्वयं के डीएलएल संकलित कर रहा हूं जिसमें कई .o फ़ाइलें शामिल हैं। .o फ़ाइलों में से एक में एक फ़ंक्शन है जो SHLoadLibraryFromItem पर कॉल करता है जो केवल विंडोज 7 पर समर्थित है। फ़ंक्शन को तब तक नहीं बुलाया जाता है जब तक कि डीएलएल का उपयोग करने वाला एप्लिकेशन विंडोज 7 पर चल रहा है। (हाँ, मुझे यकीन है।)विभिन्न विंडोज संस्करणों पर डीएलएल कैसे काम करें?

हालांकि, विंडोज़ (पुराने, एक्सपी) के पुराने संस्करण पर एप्लिकेशन चलाने पर, एक त्रुटि के साथ लॉन्च पर पूरा एप्लिकेशन क्रैश "निर्दिष्ट प्रक्रिया नहीं मिली।" हालांकि त्रुटि निर्दिष्ट नहीं करती है कि कौन सी प्रक्रिया नहीं मिली, अगर मैं SHLoadLibraryFromItem पर कॉल पर टिप्पणी करता हूं, तो सब कुछ ठीक काम करता है।

सवाल:

  1. क्यों विंडोज SHLoadLibraryFromItem भले ही यह XP पर नहीं बुलाया जा रहा है पता लगाने के लिए प्रयास कर रहा है?
  2. वहाँ विंडोज कि, जैसे कि, SHLoadLibraryFromItem लगता है केवल जब विंडोज 7, जैसे कि, आलसी बाध्यकारी किसी तरह चल रहा है नहीं है करने के लिए कोई तरीका है?
  3. यदि नहीं, तो इसके आसपास सबसे अच्छा तरीका क्या है?

एक ही रास्ता है कि मैं इस बारे में सोच सकते आस-पास या तो:

  1. उपयोग LoadLibrary विंडोज DLL लोड कि SHLoadLibraryFromItem में है और GetProcAddress का उपयोग एक सूचक-हैं- में मैन्युअल रूप से पता प्राप्त करने के लिए इसके बजाय SHLoadLibraryFromItem पर कॉल करने के लिए पॉइंटर का उपयोग करें और उपयोग करें?
  2. दो DLLs है: एक है कि कि विंडोज 7 के लिए समर्थन कर रहे कार्यों कि केवल लोड किया जाएगा शामिल हैं जब विंडोज 7.

किसी भी अन्य विचारों पर चल रहा है? जैसा कि ऊपर बताया गया है, मैं वास्तव में कुछ प्रकार की आलसी बाध्यकारी पसंद करूंगा।

अद्यतन

कृपया पढ़ें क्या मैं वास्तव में लिखा था। मैं स्पष्ट रूप से पहले अनुच्छेद में कहा गया है कि SHLoadLibraryFromItemनहीं जब तक कि मैं निश्चित रूप से कह कि आवेदन वास्तव में WINDOWS 7 पर चल रहा है

अनुप्रयोग क्रैश केवल जब DLL लोड है कहा जाता है।

उत्तर

10

लिंकर आपके द्वारा उपयोग किए जाने वाले प्रत्येक एपीआई फ़ंक्शन में आपके मॉड्यूल में एक संदर्भ एम्बेड करता है। जब विंडोज लोडर आपके निष्पादन योग्य और उसके मॉड्यूल को लोड करता है, तो उसे आपके कोड में सभी कॉल को स्मृति में उन स्थानों पर "हुक अप" करने की आवश्यकता होती है जहां एपीआई फ़ंक्शंस वास्तव में लोड होते हैं। अगर यह उन्हें नहीं मिल रहा है, तो यह जारी नहीं रहेगा।

LoadLibrary और GetProcAddress का उपयोग इस समस्या को हल करने के लिए "मानक" तरीका है।

दो डीएलएल का उपयोग करने से आपकी मदद नहीं होती है, क्योंकि जब तक उनमें से कोई भी आपके ऐप को लोड करने में विफल रहता है तब भी शुरू नहीं होगा। आप देरी-लोडिंग का उपयोग करके इसके आसपास हो सकते हैं, एक अलग मॉड्यूल में एक नए ओ/एस पर निर्भर करता है और Win32 SEH अपवाद हैंडलर में उस मॉड्यूल में सभी कॉल को लपेटकर सभी कोड डालते हैं (जब आप देरी-लोडिंग करते हैं तो आपको एक एसईएच अपवाद मिलता है मॉड्यूल लोड नहीं कर सकता)। लाभ यह है कि आप फ़ंक्शन पॉइंटर्स की गड़बड़ी के बिना "स्वचालित" लिंकिंग का उपयोग कर सकते हैं, लेकिन अपवाद हैंडलिंग बहुत खराब हो सकती है।

This article थोड़ा बताता है और कुछ उदाहरण देता है कि इसे साफ तरीके से कैसे लपेटें।

+0

आप केवल व्यक्तिगत प्रतीकों में देरी नहीं कर सकते हैं? (मुझे लिनक्स पर ईएलएफ निष्पादन योग्य में ऐसा करने में सक्षम होने के लिए उपयोग किया जाता है) –

+0

@ क्रेग रिंगर मुझे ऐसा नहीं लगता है, लिंकर को देरी-लोड पैरामीटर मॉड्यूल की एक सूची है। तकनीकी रूप से, लिंकर इसे आसानी से कर सकता है, क्योंकि यह प्रत्येक फ़ंक्शन के लिए एक स्टब उत्पन्न कर रहा है, लेकिन मुझे नहीं लगता कि ऐसा करने के लिए कोई तरीका है। –

+0

@ क्रेग रिंगर शायद मैंने आपके प्रश्न को गलत समझा है ... यदि डीएलएल मौजूद है, लेकिन आपके द्वारा संदर्भित कार्यों में से एक नहीं है, तो लिंकर द्वारा उत्पन्न विलंब-लोड कोड को प्रत्येक 'GetProcAddress()' कॉल को अलग से प्रयास करना चाहिए, इसलिए गायब एक अपवाद उत्पन्न करेगा, लेकिन अन्य अभी भी काम करेंगे। –

2

क्यों विंडोज SHLoadLibraryFromItem खोजने के लिए भले ही यह XP पर नहीं बुलाया जा रहा है प्रयास कर रहा है?

विंडोज रिकॉर्ड्स को हल करता है जब एप्लिकेशन मेमोरी में लोड होता है, कॉल नहीं होने पर। इसे "गतिशील लिंकिंग" कहा जाता है (जैसा कि एक लिंकर के साथ स्थिर लिंकिंग के विपरीत), लेकिन यह वास्तव में गतिशील नहीं है। इसलिए, यह नहीं पता कि किसी विशेष विधि को रनटाइम के दौरान बुलाया जाएगा या नहीं।

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