2010-02-20 13 views
6
#ifndef _DLL_TUTORIAL_H_ 
#define _DLL_TUTORIAL_H_ 
#include <iostream> 

#if defined DLL_EXPORT 
#define DECLDIR __declspec(dllexport) 
#else 
#define DECLDIR __declspec(dllimport) 
#endif 

extern "C" 
{ 
    DECLDIR int Add(int a, int b); 
    DECLDIR void Function(void); 
} 

#endif 

कोड DECLDIR __declspec(dllexport) कोड वास्तव में क्या करता है?कोड "DECLDIR __declspec (dllexport)" वास्तव में क्या करता है?

+1

@ दीपक: 'स्टैक ओवरफ्लो' में आपका स्वागत है! मैंने आपका कोड स्वरूपित किया है (इसे चुनें और Ctrl + K दबाएं)। –

उत्तर

1

यह DECLDIR मैक्रो निरंतर __declspec(dllexport) होने के लिए परिभाषित करता है। dllexport डीएलएल से कार्यों के निर्यात के लिए है। यहाँ this page से एक उद्धरण है:

इन विशेषताओं को स्पष्ट रूप से अपने ग्राहक है, जो निष्पादन योग्य फ़ाइल या किसी अन्य DLL किया जा सकता है DLL के इंटरफ़ेस परिभाषित करते हैं। Dllexport के रूप में कार्यों को घोषित करना मॉड्यूल-परिभाषा (.DEF) फ़ाइल की आवश्यकता को पर कम से कम निर्यात किए गए कार्यों के विनिर्देश के संबंध में समाप्त करता है। ध्यान दें कि dllexport __export कीवर्ड को प्रतिस्थापित करता है।

एक वर्ग declspec (dllexport) चिह्नित है, तो वर्ग पदानुक्रम में वर्ग टेम्पलेट्स के किसी भी विशेषज्ञताओं परोक्ष declspec (dllexport) के रूप में चिह्नित कर रहे हैं। यह का अर्थ है टेम्पलेट स्पष्ट रूप से तत्काल हैं और इसके सदस्यों को परिभाषित होना चाहिए।

__declspec, वैसे, explained here है।

8

माइक्रोसॉफ्ट दुनिया में, __declspec(dllexport) डीएलएल के बाहर से एक फ़ंक्शन या क्लास कॉल करने योग्य बनाता है।

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

यदि आप चाहते हैं कि आपका फ़ंक्शन डीएलएल के बाहर से बुलाया जाए, तो आपको इसे __declspec(dllexport) जोड़कर निर्यात करना होगा।

इसके बारे में सोचने का एक तरीका यह है कि __declspec(dllexport) एक डीएलएल के सार्वजनिक इंटरफ़ेस का हिस्सा होने के रूप में एक फ़ंक्शन को चिह्नित करता है।

जबकि आपने __declspec(dllimport) के बारे में नहीं पूछा था, तो यह विपरीत है। एक अलग डीएलएल में फ़ंक्शन को कॉल करते समय, आपके डीएलएल को यह पता होना चाहिए कि यह एक अलग डीएलएल के सार्वजनिक इंटरफ़ेस का हिस्सा है, इसलिए यह कॉल को सही तरीके से संभाल सकता है (एक अलग डीएलएल में फ़ंक्शन को कॉल करने के लिए अधिक जटिल कोड की आवश्यकता होती है जो आपके लिए फ़ंक्शन को कॉल करती है)।

+0

यह बहुत स्पष्ट है। – thezhaba

+0

इस तरह के अच्छे और आसान व्याख्या के लिए धन्यवाद – spt025

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