c++ - गतिशील रूप से एक DLL से एक सी++ वर्ग आयात




windows import (4)

डीएलएल से सी ++ क्लास को आयात करने का सही तरीका क्या है? हम दृश्य सी ++ का उपयोग कर रहे हैं

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


dllexport / dllimport काम करता है, यह हेडर फ़ाइल में अपने वर्ग के नाम से पहले रखें और आप जाने के लिए अच्छा है

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

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

अगर आप वास्तव में एक LoadLibrary शैली लोडिंग चाहते हैं, तो आपको "Extern C" wrappers के साथ अपने C ++ फ़ंक्शन को लपेट करना होगा। समस्या का नाम मैंगलिंग के कारण है, आप पूरी तरह से गड़बड़ नाम टाइप कर सकते हैं और यह काम करेगा।

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


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

यहां एक व्यावहारिक उदाहरण है, एक एमएलसी दस्तावेज़ / दृश्य को डीएलएल से निर्यात करना , गतिशील रूप से लोड किया गया है


आपको निम्न जोड़ना होगा:

extern "C"
{
...
}

फ़ंक्शन मैंगलिंग से बचने के लिए

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

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

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

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


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





import