2008-09-21 18 views
13

से गतिशील रूप से एक सी ++ कक्षा आयात करना डीएलएल से सी ++ कक्षा आयात करने का सही तरीका क्या है? हम विजुअल सी ++ का उपयोग कर रहे हैं।एक डीएलएल

dllexport/export.def + LoadLibrary + GetProcAddress trifecta है, लेकिन यह सी ++ कक्षाओं पर काम नहीं करता है, केवल सी फ़ंक्शन। क्या यह सी ++ नाम-मैंगलिंग के कारण है? मैं यह काम कैसे पूरा कर सकता हूं?

उत्तर

2

मैं आमतौर पर एक इंटरफेस बेस क्लास घोषित करता हूं, मेरे आवेदन में इस घोषणा का उपयोग करता हूं, फिर फैक्ट्री फ़ंक्शन प्राप्त करने के लिए लोड लाइब्रेरी, GetProcAddress का उपयोग करता हूं। कारक हमेशा इंटरफेस प्रकार के सूचक देता है।

यहाँ एक व्यावहारिक उदाहरण, exporting an MFC document/view from a DLL गतिशील लोड

1

dllexport/dllimport काम करता है, हेडर फाइल में अपने वर्ग के नाम से पहले ही जगह है और आप बिल्कुल तैयार हैं है।

आमतौर पर आप डीएल में ड्लेक्सपोर्ट का उपयोग करना चाहते हैं, और exe में dllimport (लेकिन आप बस हर जगह dllexport का उपयोग कर सकते हैं और यह काम करता है, इसे 'सही' इसे लोड करने के लिए तेज़ी से तेज़ बनाता है)।

जाहिर है कि लिंक-टाइम संकलन के लिए है। आप इसे 'गतिशील' बनाने के लिए लिंकर निर्देश का उपयोग/देरी कर सकते हैं, लेकिन शायद यह नहीं है कि आप विषय पंक्ति से क्या चाहते हैं।

यदि आप वास्तव में लोड लाइब्रेरी शैली लोडिंग चाहते हैं, तो आपको अपने सी ++ कार्यों को "बाहरी सी" रैपर के साथ लपेटना होगा। समस्या नाम के कारण है, आप पूरी तरह से उलझन में टाइप कर सकते हैं और यह काम करेगा।

कामकाज आम तौर पर एक सी फ़ंक्शन प्रदान करने के लिए होते हैं जो सही कक्षा में एक सूचक देता है - COM इस तरह से काम करता है, क्योंकि यह एक डीएल से 4 सी फ़ंक्शंस निर्यात करता है जिसका उपयोग डीएल में ऑब्जेक्ट के अंदर इंटरफ़ेस विधियों को प्राप्त करने के लिए किया जाता है। ।

12

आप निम्न जोड़ने की जरूरत:

extern "C" 
{ 
... 
} 

समारोह mangling से बचने के लिए।

आप दो साधारण सी कार्यों लिखने पर विचार हो सकता है:

SomeClass* CreateObjectInstace() 
{ 
    return new SomeClass(); 
} 

void ReleaseObject(SomeClass* someClass) 
{ 
    delete someClass; 
} 

केवल उन कार्यों आप बाद में जोड़ सकते हैं/अपने ऑब्जेक्ट निर्माण/हटाए जाने के परिवर्तन कार्यक्षमता का उपयोग करके। इसे कभी-कभी फैक्ट्री कहा जाता है।

+1

क्या इन 'SomeClass' नामों में तारांकन नहीं होना चाहिए (यानी' कुछ क्लास 'पर पॉइंटर्स हों)? –

2

बाहर चेक this question। असल में, दो तरीके हैं। आप _dllexport का उपयोग कर कक्षा को चिह्नित कर सकते हैं और फिर आयात लाइब्रेरी से लिंक कर सकते हैं, और डीएलएल स्वचालित रूप से लोड हो जाएगा। या यदि आप डीएलएल को गतिशील रूप से लोड करना चाहते हैं, तो आप फैक्ट्री फ़ंक्शन विचार का उपयोग कर सकते हैं कि @titanae ने

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