मुझे पोर्टेबल डीएलएल बनाने में उपयोगी होने के लिए __declspec (dllexport) और .def फ़ाइल दोनों का उपयोग मिल गया है, यानी डीएलएल जिन्हें एक अलग कंपाइलर या विभिन्न कंपाइलर सेटिंग्स के साथ संकलित कोड से बुलाया जा सकता है।
बस अपने फ़ंक्शन घोषणाओं पर __declspec (dllexport) डालने से उन कार्यों को आपके डीएलएल (कम से कम विंडोज़) द्वारा "निर्यात" किया जाएगा ताकि उन्हें डीएलएल के बाहर से बुलाया जा सके।
हालांकि, एक .def फ़ाइल बनाने के लिए जो आपके सभी निर्यात किए गए कार्यों को सूचीबद्ध करता है, आपको माइक्रोसॉफ्ट कंपाइलर्स (उदाहरण के लिए) को एक अग्रणी अंडरस्कोर और निर्यात किए गए फ़ंक्शन नाम पर पिछली पैरामीटर-चौड़ाई जानकारी जोड़ने से रोकता है (कम से कम जब __stdcall निर्देश के साथ संयुक्त, पोर्टेबिलिटी के लिए भी उपयोगी)। जैसे समारोह घोषणा
void foo(int i);
लग सकती है के रूप में "_foo @ 4" निर्यात किया जा रहा है अगर तुम सम्मेलन और .def फ़ाइल उपयोग बुला के बारे में सावधान नहीं हैं।
इस तरह के नाम-सजावट से मुक्त प्रतीक तालिका में निर्यात किए गए फ़ंक्शन नामों को ध्यान में रखते हुए GetProcAddress() को लोड करने और डीएलएल में स्पष्ट रूप से रनटाइम पर हुक करने के हिस्से के रूप में कॉल करते समय वास्तव में आसान होता है। अर्थात() ऊपर समारोह foo के लिए सूचक प्राप्त करने के लिए कार्यावधि में (यह मानते हुए कि सब पर निर्यात किया गया था), आप आदर्श सिर्फ कॉल करना चाहते हैं:
HANDLE dllHandle = LoadLibrary("mydll.dll");
void* fooFcnPtr = GetProcAddress(dllHandle, "foo");
कुछ उपयुक्त त्रुटि मामले निश्चित रूप से जाँच के साथ
!
आपके डीएलएल के निर्माण के दौरान आपके फ़ंक्शन घोषणाओं पर एक .def फ़ाइल प्लस __stdcall, __declspec (dllexport) और बाहरी "सी" का उपयोग सुनिश्चित करेगा कि उपरोक्त क्लाइंट-साइड कोड कंपेलरों और कंपाइलर सेटिंग्स की विस्तृत श्रृंखला के लिए काम करेगा ।
स्रोत
2009-02-28 05:47:15
एम एम क्लूनी ने कहा: "और क्या?"। +1। एक विंडोज डेवलपर के रूप में, मेरा अनुभव यह है कि डीईएफ फाइलें "पुरानी तरीका" हैं, और उन्हें बहिष्कृत किया जाना चाहिए (यदि पहले से नहीं है)। – paercebal
हां, .def फ़ाइलें __declspec भाषा एक्सटेंशन को पूर्ववत करती हैं। एक .def फ़ाइल में ऐसा कुछ भी नहीं है जिसे आप या तो __declspec या #pragmas से नहीं कर सकते हैं। इसमें फैंसी लिंकर ट्रिक्स शामिल हैं जैसे एनीमेशन का नामकरण या अग्रेषण करना। –