में कनवर्ट करें मैंने सी ++/सीएलआई पॉइंटर को देशी सी ++ पॉइंटर में परिवर्तित करने की इस समस्या में भाग लिया है। पृष्ठभूमि है: मैं सी ++/सीएलआई का उपयोग कर एक विंडोज़ फॉर्म एप्लीकेशन लिख रहा हूं। एप्लिकेशन कई COM इंटरफेस में कॉल करता है। जब उदाहरण बनाकर COM इंटरफेस के माध्यम से एक वस्तु का (एक सी ++/CLR वर्ग के अंदर), मैं CoCreateInstance
करने के लिए पिछले तर्क के रूप में (void**)(&provider)
में गुजरती हैं, के रूप में:सी ++/सीएलआई पॉइंटर से देशी सी ++ पॉइंटर
HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
हालांकि, मैं संकलक त्रुटि मिलती है: cli::interior_ptr<Type>
से void **
में परिवर्तित नहीं कर सकते हैं। मैंने इसमें कुछ शोध किया है, और ऐसा लगता है कि यह सी ++ और सी ++/सीएलआई में विभिन्न प्रकार के पॉइंटर्स की समस्या है। किसी को इसके बारे में कोई जानकारी है, और शायद यह एक टिप तय किया जा सकता है कि इसे कैसे ठीक किया जा सकता है? अग्रिम में Thanx!
सबसे पहले, आपकी सभी मदद के लिए thanx!
जैसा कि फ्रीच ने सुझाव दिया था, मैंने pin_ptr
का उपयोग करने की कोशिश की, लेकिन इसके बजाय संकलक ने interior_ptr
से pin_ptr
में परिवर्तित होने वाली समस्याओं के बारे में शिकायत की। मैं बजाय के रूप interior_ptr
का उपयोग करने का प्रयास करें:
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, (void**)pinnedPtr);
मैं interior_ptr
से interior_ptr
में परिवर्तित नहीं कर सकते हैं। यह सब interior_ptr
को void**
में परिवर्तित करने की समस्या को उबालता है। इस तरह: (void**)interiorPtr
, जहां interiorPtr
पाठ्यक्रम interior_ptr
है। इसमें कोई विचार है?
यह खतरनाक प्रतीत होता है! मेरे पास पहले एक समान (या समान) स्थिति थी: मैंने एक पिन पॉइंटर बनाया और मूल सूचक (जैसे आप करते हैं) लौटा दिया, लेकिन फिर ऑब्जेक्ट स्थानांतरित हो गया क्योंकि फ़ंक्शन समाप्त हो गया और पिन किया गया पॉइंटर हटा दिया गया था, इसलिए ऑब्जेक्ट अब नहीं था पिन किया गया और मूल सूचक अवैध था! यह डिबगिंग के दौरान देखा जा सकता है या नहीं भी हो सकता है, लेकिन निश्चित रूप से यह आपके रिलीज़ संस्करण में होगा जब आप इसकी अपेक्षा नहीं करते हैं। –
@TobiasKnauss 'std :: string :: string (const char *) 'कन्स्ट्रक्टर संदर्भित डेटा की एक प्रति बनाता है, इसलिए यह ठीक है अगर फ़ंक्शन से बाहर होने पर संदर्भित स्मृति अब पिन नहीं की जाती है। –