2008-09-11 14 views
40

में चार * और सिस्टम :: स्ट्रिंग के बीच कनवर्ट करने का सबसे अच्छा तरीका क्या है char * से सिस्टम :: स्ट्रिंग और सी ++/सीएलआई में वापस कनवर्ट करने का अनुमोदित तरीका क्या है? मुझे marshal_to <> Google पर टेम्पलेट किए गए फ़ंक्शंस के कुछ संदर्भ मिले, लेकिन ऐसा लगता है कि इस सुविधा ने विजुअल स्टूडियो 2005 के लिए कभी भी कटौती नहीं की है (और विजुअल स्टूडियो 2008 या तो AFAIK में नहीं है)। मैंने Stan Lippman's blog पर कुछ कोड भी देखा है, लेकिन यह 2004 से है। मैंने मार्शल :: स्ट्रिंगटोएच ग्लोबलएन्सी() भी देखा है। क्या कोई ऐसी विधि है जिसे "सर्वश्रेष्ठ अभ्यास" माना जाता है?सी *+/सीएलआई

उत्तर

18

वहाँ एक अच्छा सिंहावलोकन यहां (इस marshaling समर्थन VS2008 के लिए जोड़ा) है: http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

+7

धन्यवाद, लेकिन है कि एक लंबी व्याख्या है। यह बिंदु पर और अधिक जाता है: '# शामिल // marshal_context संदर्भ; // my_c_string = context.marshal_as (my_csharp_string); ' – gatopeich

+0

जो लोग सोचते हैं, संदर्भ के लिए पूर्ण नामस्थान' msclr :: interop :: marshal_context' – Mugen

1

हमने जो किया वह एक सी ++ \ सीएलआई ऑब्जेक्ट बनाया गया है जो अनमंगा कोड में स्ट्रिंग आयोजित करता है और आइटम की मैंग की प्रतियां देता है। रूपांतरण कोड बहुत अधिक दिखता है जैसे स्टेन ने अपने ब्लॉग पर क्या किया है (मैं इसे बिल्कुल याद नहीं कर सकता) (यदि आप उसका कोड उपयोग करते हैं तो सुनिश्चित करें कि आप इसे हटाने के लिए अपडेट करें []) लेकिन हमने यह सुनिश्चित किया है कि विनाशक सभी को रिहा कर देगा वस्तु के असंगत तत्व। यह थोड़ा उलझन में है लेकिन जब हम विरासत सी ++ कोड मॉड्यूल में बंधे हैं तो हमारे पास रिसाव नहीं था।

70

सिस्टम :: स्ट्रिंग एक निर्माता है कि एक चार * लेता है:

using namespace system; 
const char* charstr = "Hello, world!"; 
String^ clistr = gcnew String(charstr); 
Console::WriteLine(clistr); 

एक चार हो रही है * वापस है थोड़ा कठिन, लेकिन बहुत बुरा नहीं:

IntPtr p = Marshal::StringToHGlobalAnsi(clistr); 
char *pNewCharStr = static_cast<char*>(p.ToPointer()); 
cout << pNewCharStr << endl; 
Marshal::FreeHGlobal(p); 
+4

+1, सिस्टम :: स्ट्रिंग कन्स्ट्रक्टर में लंबाई और एन्कोडिंग भी होती है! –

+5

'मार्शल :: स्ट्रिंगटॉएच ग्लोबलएन्सी '' marshal_context' (जैसा मैथ्यू द्वारा उल्लिखित) की तुलना में एक खराब विकल्प है, जो स्वचालित रूप से बफर को मुक्त करने के लिए RAII का उपयोग करता है। उल्लेख नहीं है कि नाम पूरी तरह से गलत है, यह एक 'HGLOBAL' वापस नहीं करता है। –

1

मैंने कुछ सहायक तरीकों का निर्माण किया। मुझे पुराने क्यूटी लाइब्रेरी से सीएलआई स्ट्रिंग में जाने के लिए ऐसा करने की ज़रूरत थी। अगर कोई इस पर जोड़ सकता है और मुझे बता सकता है कि ऐसा लगता है कि मेरे पास मेमोरी रिसाव है और मैं इसे ठीक करने के लिए क्या कर सकता हूं, तो मैं सबसे ज्यादा सराहना करता हूं। संभव तरीकों के सारांश को

void MarshalString ( String^s, wstring& os) { 
    using namespace Runtime::InteropServices; 
    const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer(); 
    os = char; 
} 
QString SystemStringToQt(System::String^ str) 
{ 
    wstring t; 
    MarshalString(str, t); 
    QString r = QString::fromUcs2((const ushort*)t.c_str()); 
    return r; 
} 
+0

शायद मार्शल :: FreeHGlobal (IntPtr ((शून्य *) वर्णों के लिए है); यह –

+0

@Pat हाँ क्षमा करें मुझे इसके बाद इसे अपडेट करना चाहिए था। मैंने इसे अभी अच्छी तरह से काम किया है। इसे .NET पर ले जाने से इस ऐप के प्रदर्शन में 3x की वृद्धि हुई। यहां तक ​​कि चारों ओर मार्शल चीजें भी। – dko

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