मेरे पास एक डीएलएल है जिसे होस्ट एप्लिकेशन में एसटीएल कंटेनर में संग्रहीत डेटा तक पहुंचने की आवश्यकता है। चूंकि सी ++ में कोई मानक एबीआई नहीं है, और मैं विभिन्न कंपाइलर्स का समर्थन करना चाहता हूं, एप्लिकेशन और डीएलएल के बीच इंटरफेस को मूल रूप से सादे-पुराने डेटा रखना है।डीएलएल सीमा पर एसटीएल सूची का खुलासा कैसे करें?
वैक्टरों के लिए यह अपेक्षाकृत सरल है। आप बस वेक्टर की स्मृति ब्लॉक लौट सकते हैं, क्योंकि यह contigious होने की गारंटी है:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
अब DLL कि इंटरफ़ेस के माध्यम से वेक्टर के डेटा के लिए सुरक्षित रीड ओनली पहुंच हो सकता है। डीएलएल सामग्री को अपनी सदिश में भी कॉपी करने के लिए लपेट सकता है।
हालांकि एसटीएल सूचियों (और डेक) के बारे में क्या? क्या डीएलएल सीमा के माध्यम से पहुंच की अनुमति देने का कोई और आसान तरीका है? या मुझे किसी प्रकार का GetFirst()/GetNext() इंटरफ़ेस का सहारा लेना होगा? मुझे कई सूचियों के लिए ऐसा करने की आवश्यकता हो सकती है, इसलिए वेक्टर के रूप में सरल समाधान होना अच्छा लगेगा।
आप सही हैं कि अगर मैं सभी संकलन सेटिंग्स समान हैं तो मैं इससे दूर हो सकता हूं। लेकिन यह एक प्लगइन आर्किटेक्चर के लिए है और मैं विभिन्न कंपाइलर्स का समर्थन करना चाहता हूं। मैंने इसे स्पष्ट करने के लिए प्रश्न संपादित किया है। – AshleysBrain
मैं इसके साथ सहमत हूं, लेकिन शायद आपको तनाव होना चाहिए कि यह केवल लेआउट नहीं है - कोड को संकलक के उसी संस्करण के साथ संकलित किया जाना चाहिए, ताकि नए तरीके और कार्यान्वयन के तरीके को कार्यान्वित किया जा सके। –
यदि आप निर्माण सेटिंग/कंपाइलर संस्करणों को कठोर रूप से लागू कर रहे हैं और सबकुछ आपके नियंत्रण में है, तो, स्थिर पुस्तकालयों का उपयोग करके डीएलएल का बनाम क्या लाभ है और सबकुछ एक निष्पादन योग्य में जोड़ना है? –