2011-06-21 13 views
5

क्या यह बाइट्स को डेटा को "एन्कोड" करने के लिए संयुक्त किया गया है?COM स्ट्रिंग (BSTR) और .NET स्ट्रिंग के बीच क्या अंतर है?

मुझे उत्सुकता है क्योंकि मुझे आश्चर्य है कि आरसीडब्ल्यू स्वचालित रूप से .NET स्ट्रिंग कैसे लेता है और इसे COM BSTR में बदल देता है। मुझे लगता है कि यह सिर्फ एक .NET स्ट्रिंग से परिवर्तित एक वैध COM BSTR बनाता है।

संबंधित: क्या मैं अपने बाइट प्रकार का उपयोग .NET में कर सकता हूं?

उत्तर

9

दो स्ट्रिंग प्रकार बिल्कुल संबंधित नहीं हैं। एक प्रकार को दूसरे प्रकार में बदलने के लिए एक परिवर्तन होना पड़ता है।

ए बीएसआर में कई सम्मेलनों का पालन किया जाना चाहिए जिसमें SysAllocString * के माध्यम से आवंटित, SysFreeString के साथ विघटित, लम्बाई उपसर्ग होने और दो शून्य वर्णों का टर्मिनेटर शामिल होना चाहिए।

http://msdn.microsoft.com/en-us/library/ms221069.aspx

एक नेट स्ट्रिंग प्रबंधित प्रकार है कि प्रबंधित ढेर के माध्यम से आवंटित किया जाता है है। इसका जीवनकाल सीएलआर कचरा कलेक्टर द्वारा प्रबंधित किया जाता है।

अपनी खुद की BSTR का निर्माण करना है, यह बहुत बेहतर हो उपयोग करने के लिए होगा Marshal.StringToBSTR:

http://msdn.microsoft.com/en-us/library/ms221458.aspx

+0

धन्यवाद joncham:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtobstr.aspx

अगर वह पर्याप्त आप PInvoke कर सकते हैं SysAllocString अच्छा नहीं है । बहुत उपयोगी। मुझे लगता है कि मैं बस सोच रहा हूं कि अगर बिट्स और बाइट्स का निरीक्षण किया जाए तो अंतर क्या होगा। वे दोनों कहीं संग्रहीत हो जाते हैं। वे दोनों कुछ प्रतिनिधित्व करते हैं। क्या वे एक ही चीज़ (वर्णों की एक स्ट्रिंग) का प्रतिनिधित्व करने के लिए बस अलग-अलग बिट्स और बाइट्स नहीं हैं? – richard

+2

हां, सभी डेटा केवल बाइट्स है ;-)। समस्या यह है कि उन बाइट्स को आवंटित/हटाता है, और उन बाइट्स को डालने पर उपयोग किए जाने वाले सम्मेलन। उदाहरण के लिए, जब एक BSTR आवंटित करते हैं तो आप वास्तव में आवंटित स्मृति की शुरुआत में पॉइंटर पुनर्प्राप्त नहीं करते हैं। आपका पॉइंटर आवंटित स्थान में 4 बाइट्स है, क्योंकि पहले चार बाइट स्ट्रिंग की लंबाई संग्रहीत करते हैं। – joncham

+0

@ रिचर्ड डेस्लोन्डे: हाँ, वे दोनों पात्रों के सरणी हैं। हालांकि, आप वास्तव में 'System.String' के रूप में वर्णों की किसी भी स्ट्रिंग का उपयोग नहीं कर सकते हैं, क्योंकि' System.String' के किसी भी निर्माता को वर्ण सरणी को किसी अन्य स्मृति स्थान पर कॉपी कर देगा। – codekaizen

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