2009-08-12 9 views
5

निम्नलिखित वर्गों के साथ एक DLL को देखते हुए:__declspec (dllimport/dllexport) और विरासत

#define DLLAPI __declspec(...) 

class DLLAPI Base 
{ 
    public: 
    virtual void B(); 
}; 

class Derived : public Base 
{ 
    public: 
    virtual void B(); 
    virtual void D(); 
}; 

मेरी "व्युत्पन्न" वर्ग dll के दृश्य के बाहर हो जाएगा, भले ही "DLLAPI" कीवर्ड पर लागू नहीं है वर्ग परिभाषा (कम से कम, सीधे नहीं)?

क्या "डी()" फ़ंक्शन दिखाई देता है?

धन्यवाद

उत्तर

4

क्लास व्युत्पन्न आपके डीएलएल द्वारा निर्यात नहीं किया जाएगा। कक्षाओं को निर्यात करने का वारिस नहीं है। उस पर DLLAPI भी जोड़ें।

ध्यान दें कि कक्षा के सदस्य निजी पहुंच के लिए डिफ़ॉल्ट हैं, इसलिए आपकी कोई भी विधि सुलभ नहीं होनी चाहिए। हालांकि, मुझे बेस :: बी() को मेरे परीक्षण में निर्यात किया जा रहा है। डीएलएल-प्रयोग कोड में सी ++ हेडर त्रुटि को ध्वजांकित करेगा, लेकिन मुझे आश्चर्य है कि अगर आप इसे मूर्ख बना सकते हैं, तो आपने हेडर को tweaked किया है।

वैसे भी, अगर आप का दृष्टांत था एक अपने DLL अंदर व्युत्पन्न (एक और प्रवेश बिंदु के माध्यम से), आभासी मेज अभी भी काम करना चाहिए, इसलिए यदि आप ने क्या किया:

Base* b = getTheDerived(); b->B(); 

आप आह्वान करता हूँ व्युत्पन्न :: बी ()।

3

आप एक दृश्य स्टूडियो कमांड शेल से पता कर सकते हैं

link /dump /exports <yourdll> 

टाइपिंग वे निर्यात किया जाता है, तो आप कार्यों के लिए "सजाया नाम" देखेंगे द्वारा। क्या वे मानव पठनीय प्रारूप में हैं देखने के लिए, एक कॉपी-पेस्ट और कर

undname <decorated name> 
1

नहीं है, व्युत्पन्न DLL के दृश्य बाहर नहीं किया जाएगा। व्युत्पन्न कक्षा को निर्यात करने के लिए, आपको डीएलएएलपीआई मैक्रो को व्युत्पन्न कक्षाओं में भी लागू करना होगा।

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