मैं अपने स्वयं के डीएलएल संकलित कर रहा हूं जिसमें कई .o
फ़ाइलें शामिल हैं। .o
फ़ाइलों में से एक में एक फ़ंक्शन है जो SHLoadLibraryFromItem
पर कॉल करता है जो केवल विंडोज 7 पर समर्थित है। फ़ंक्शन को तब तक नहीं बुलाया जाता है जब तक कि डीएलएल का उपयोग करने वाला एप्लिकेशन विंडोज 7 पर चल रहा है। (हाँ, मुझे यकीन है।)विभिन्न विंडोज संस्करणों पर डीएलएल कैसे काम करें?
हालांकि, विंडोज़ (पुराने, एक्सपी) के पुराने संस्करण पर एप्लिकेशन चलाने पर, एक त्रुटि के साथ लॉन्च पर पूरा एप्लिकेशन क्रैश "निर्दिष्ट प्रक्रिया नहीं मिली।" हालांकि त्रुटि निर्दिष्ट नहीं करती है कि कौन सी प्रक्रिया नहीं मिली, अगर मैं SHLoadLibraryFromItem
पर कॉल पर टिप्पणी करता हूं, तो सब कुछ ठीक काम करता है।
सवाल:
- क्यों विंडोज
SHLoadLibraryFromItem
भले ही यह XP पर नहीं बुलाया जा रहा है पता लगाने के लिए प्रयास कर रहा है? - वहाँ विंडोज कि, जैसे कि,
SHLoadLibraryFromItem
लगता है केवल जब विंडोज 7, जैसे कि, आलसी बाध्यकारी किसी तरह चल रहा है नहीं है करने के लिए कोई तरीका है? - यदि नहीं, तो इसके आसपास सबसे अच्छा तरीका क्या है?
एक ही रास्ता है कि मैं इस बारे में सोच सकते आस-पास या तो:
- उपयोग
LoadLibrary
विंडोज DLL लोड किSHLoadLibraryFromItem
में है औरGetProcAddress
का उपयोग एक सूचक-हैं- में मैन्युअल रूप से पता प्राप्त करने के लिए इसके बजायSHLoadLibraryFromItem
पर कॉल करने के लिए पॉइंटर का उपयोग करें और उपयोग करें? - दो DLLs है: एक है कि कि विंडोज 7 के लिए समर्थन कर रहे कार्यों कि केवल लोड किया जाएगा शामिल हैं जब विंडोज 7.
किसी भी अन्य विचारों पर चल रहा है? जैसा कि ऊपर बताया गया है, मैं वास्तव में कुछ प्रकार की आलसी बाध्यकारी पसंद करूंगा।
अद्यतन
कृपया पढ़ें क्या मैं वास्तव में लिखा था। मैं स्पष्ट रूप से पहले अनुच्छेद में कहा गया है कि SHLoadLibraryFromItem
नहीं जब तक कि मैं निश्चित रूप से कह कि आवेदन वास्तव में WINDOWS 7 पर चल रहा है
अनुप्रयोग क्रैश केवल जब DLL लोड है कहा जाता है।
आप केवल व्यक्तिगत प्रतीकों में देरी नहीं कर सकते हैं? (मुझे लिनक्स पर ईएलएफ निष्पादन योग्य में ऐसा करने में सक्षम होने के लिए उपयोग किया जाता है) –
@ क्रेग रिंगर मुझे ऐसा नहीं लगता है, लिंकर को देरी-लोड पैरामीटर मॉड्यूल की एक सूची है। तकनीकी रूप से, लिंकर इसे आसानी से कर सकता है, क्योंकि यह प्रत्येक फ़ंक्शन के लिए एक स्टब उत्पन्न कर रहा है, लेकिन मुझे नहीं लगता कि ऐसा करने के लिए कोई तरीका है। –
@ क्रेग रिंगर शायद मैंने आपके प्रश्न को गलत समझा है ... यदि डीएलएल मौजूद है, लेकिन आपके द्वारा संदर्भित कार्यों में से एक नहीं है, तो लिंकर द्वारा उत्पन्न विलंब-लोड कोड को प्रत्येक 'GetProcAddress()' कॉल को अलग से प्रयास करना चाहिए, इसलिए गायब एक अपवाद उत्पन्न करेगा, लेकिन अन्य अभी भी काम करेंगे। –