डीएलएल (डीएलएल में कन्स्ट्रक्टर) से कुछ वर्ग कैसे बनाएं? (С ++) या डीएल से गतिशील रूप से कक्षा को कैसे लोड करें?डीएलएल (डीएल में कन्स्ट्रक्टर) से कुछ वर्ग कैसे बनाएं? (С ++)
उत्तर
का जवाब आपके सवाल का सख्ती से, आप एक extern "सी" समारोह है कि निर्माता का परिणाम देता है जोड़ने की जरूरत:
extern "C" foo* __declspec(dllexport) new_foo(int x) {
return new foo(x);
}
फिर अपने स्रोत में आप GetProcAddr "new_foo" पर उपयोग कर सकते हैं समारोह कॉल करने के लिए ।
आपको डीएलएल से एक फ़ंक्शन निर्यात करने की आवश्यकता होगी जो निर्माता को कॉल करता है और नई ऑब्जेक्ट देता है।
कंक्रीट सी ++ प्रकारों को फ़ंक्शन पैरामीटर के रूप में उपयोग करने से बचने का प्रयास करें; डीएलएल का विचार यह है कि आप उन्हें स्वतंत्र रूप से अपडेट कर सकते हैं, लेकिन एक अपग्रेड किया गया कंपाइलर std :: स्ट्रिंग को अलग-अलग रख सकता है, जिससे रनटाइम पर असंगतता हो सकती है।
यह COM की जड़ पर है, उदाहरण के लिए - सीमित प्रकार की प्रणाली और ऑब्जेक्ट्स के उदाहरण प्राप्त करने के लिए मानक निर्यातित फ़ंक्शन।
टीटी लगता है जैसे डीएलएल का स्रोत उसके नियंत्रण में नहीं है। –
डीएलएल स्रोत मेरे नियंत्रण में है – SomeUser
यदि वर्ग का उपयोग करने का इरादा है, तो इसे शायद पहले से ही __declspec (dllexport) के साथ संकलित किया जाना चाहिए, इसलिए यह केवल हेडर फ़ाइल को __declspec (dllimport) में रखने के लिए हेडर फ़ाइल को समझाने का विषय है कक्षा परिभाषा। यदि नहीं, तो आप हमेशा हेडर फ़ाइल को संशोधित कर सकते हैं। – JesperE
डीएलएल बनाने के दौरान आपको __declspec(dllexport)
कीवर्ड का उपयोग करके अपनी कक्षा घोषित करने की आवश्यकता है। DLL उपयोग करते समय, वर्ग __declspec(dllimport)
साथ घोषित किए जाने की जरूरत:
#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif
class DECLSPEC_CLASS MyClass
{
...
}
जब DLL संकलित किया गया है, तो आप परिभाषित करता है की सूची में -DCOMPILING_DLL जोड़ना चाहिए।
कक्षा का उपयोग करते समय, आपको डीएलएल के साथ स्थाई रूप से लिंक करना होगा, यानी मुख्य प्रोग्राम में आयात लाइब्रेरी mydll.lib को पास करना होगा।
यदि आप रनटाइम पर DLL लोड करना चाहते हैं, तो आपको DLL में एक सी-फ़ंक्शन होना चाहिए जो ऑब्जेक्ट बनाता है और इसे आपके लिए लौटाता है। डीएलएल में गतिशील रूप से एक कन्स्ट्रक्टर को देखने का कोई तरीका नहीं है (GetProcAddress() का उपयोग करके)।
__declspec का उपयोग कर वर्ग की हर विधि के निर्यात के बजाय, आप यह भी सच है पर भरोसा कर सकते कि संकलक vtable के माध्यम से आभासी कार्यों आह्वान कर सकते हैं, तो उदाहरण के लिए:
//note: no __declspec
class IPublicInterface
{
virtual ~IPublicInterface() = 0;
virtual void SomeMethod() = 0;
};
//note: no __declspec
class SomeClass : IPublicInterface
{
virtual ~SomeClass() { ... }
virtual void SomeMethod() { ... }
};
//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
return new SomeClass();
}
इंटरफ़ेस/फ़ैक्टरी पैटर्न अच्छा है, खासकर यदि आप 'GetProcAddress' का उपयोग करने जा रहे हैं और मैन्युअल रूप से प्रबंधित हैं .def निर्यात तालिका –
चूंकि स्मृति DLL में आवंटित की गई है, हो सकता है कि वहां' फ्रीसम क्लास (IPublicInterface *) भी हो सुनिश्चित करें कि स्मृति सही ढंग से मुक्त हो गया है? – Robert
मुझे लगता है कि यह उत्तर गलत है और इसे हटाया जाना चाहिए। आप प्लगइन सीमा पर एक पॉलिमॉर्फिक ऑब्जेक्ट पास नहीं कर सकते हैं, सिवाय इसके कि जब प्लगइन और एप्लिकेशन दोनों में सटीक उसी कंपाइलर का उपयोग किया जाता है। –
- 1. С ++ `टाइमर` वर्ग कार्यान्वयन
- 2. एक स्थिर आंतरिक वर्ग कन्स्ट्रक्टर से वसंत बीन कैसे बनाएं?
- 3. एक डीएलएल हैंडल वर्ग
- 4. डीएल
- 5. कन्स्ट्रक्टर में कुछ कार्रवाई कैसे जोड़ें?
- 6. एकाधिक वर्ग कन्स्ट्रक्टर Matlab
- 7. डीएलएल (डीएलएल स्टार्ट फ़ंक्शन में) से क्यूटी जीयूआई शुरू करना
- 8. गिइस इंजेक्शन केवल कुछ कन्स्ट्रक्टर
- 9. डीएल
- 10. किसी वर्ग 'कन्स्ट्रक्टर
- 11. देशी डीएल से सी # अनुप्रयोग
- 12. एक डीएल
- 13. जीएसी में इंटरऑप डीएल रखो?
- 14. पायथन में एक डीएल से कक्षा तक कैसे पहुंचे?
- 15. प्लगइन डीएलएल के रूप में एएसपी.नेट एमवीसी क्षेत्र कैसे बनाएं?
- 16. सी में एक डीएलएल बनाएं और इसे C++ प्रोजेक्ट
- 17. कुछ वर्ग प्रकार
- 18. एक डीएलएल में कक्षा का उपयोग कर वीबी 6 एप्लिकेशन बनाएं, फिर निर्माण के बाद डीएलएल को स्वैप करें?
- 19. सी # परियोजना से सी ++ डीएल डीबग कैसे करें?
- 20. अन्य स्थान से .NET संदर्भ डीएल
- 21. स्टैंड डीएल
- 22. डीएलएल
- 23. tastypie में कुछ फ़िल्टर अनिवार्य कैसे बनाएं?
- 24. क्या मैं प्रति वर्ग 1 डीएल में एक बड़ा डीएल अलग कर सकता हूं?
- 25. डीएल मेमोरी प्रबंधन
- 26. मैं संसाधन डीएल
- 27. डीएल कॉल
- 28. डीएल
- 29. .NET टूलबॉक्स में स्थायी रूप से एक डीएलएल कैसे जोड़ें?
- 30. बाइनरी डीएल फ़ाइल
आप उससे मिलते-जुलते हेडर फाइल की क्या ज़रूरत है और/या पुस्तकालय फ़ाइल डीएल तक पहुंचने के लिए? –
हाँ मेरे पास मेरे हेडर और स्रोत हैं – SomeUser