2010-03-01 15 views
6

वहाँ रहे हैं से किसी भी आसान से उपयोग, उच्च स्तरीय वर्ग या पुस्तकालयों कि आप विज़ुअल सी में VARIANT रों के साथ बातचीत करते ++?एक आसान तरीका करने के लिए/परिवर्तित करने के लिए सी में भिन्न प्रकारों ++

अधिक विशेष रूप से, मैं पॉड प्रकार (उदा double, long), तार (जैसे CString), और कंटेनरों (जैसे std::vector) और VARIANT रों के बीच रूपांतरित करना चाहते हैं। उदाहरण के लिए:

long val = 42; 
VARIANT var; 
if (ToVariant(val, var)) ...  // tries to convert long -> VARIANT 
comObjPtr->someFunc(var); 

std::vector<double> vec; 
VARIANT var = comObjPtr->otherFunc(); 
if (FromVariant(var, vec)) ... // tries VARIANT -> std::vector<double> 

मैं (? भोलेपन से) मान लिया है कि कॉम के साथ काम कर रहे लोगों यह सब समय है, इसलिए वहाँ सबसे अधिक संभावना एक एकल सुविधाजनक पुस्तकालय कि रूपांतरण के सभी प्रकार के हैंडल किया जाएगा। लेकिन सब है कि मैं खोजने के लिए कर लिया है आवरण वर्गों में से एक बहुरंग वर्गीकरण है कि प्रत्येक कुछ प्रकार परिवर्तित:

  • _variant_t या CComVariant पॉड प्रकार के लिए
  • _bstr_t, CComBSTR, या BSTR स्ट्रिंग्स के लिए
  • अजीब स्मृति का प्रबंधन के इस दुःस्वप्न से बचने के लिए - विजुअल बेसिक में स्विच करने की कम - CComSafeArray या SAFEARRAY सरणियों

के लिए कोई आसान तरीका है ment और bitwise VT_ARRAY | VT_I4 कोड?

संबंधित प्रश्न:

+0

सवाल वास्तव में [C++] (जो उस निर्माण में नहीं है) पर लागू नहीं होता है, केवल दृश्य बोलीभाषा। – dmckee

+0

@ डीएमकी: ठीक है आप हैं। –

+0

जो भी उत्सुक है, उसके लिए पीओडी का अर्थ यहां एक स्टैक ओवरफ्लो उत्तर है। http://stackoverflow.com/questions/146452/what-are-pod-types-in-c –

उत्तर

4

ठीक है, कड़ी मेहनत से ज्यादातर पहले से ही आप के लिए विभिन्न आवरण वर्गों के साथ किया जाता है। मैं _variant_t और _bstr_t पसंद करता हूं क्योंकि वे पीओडी प्रकारों और तारों से रूपांतरण के लिए अधिक उपयुक्त होते हैं। सरल सरणी के लिए, आपको वास्तव में टेम्पलेट रूपांतरण फ़ंक्शन की आवश्यकता है। निम्नलिखित की तरह कुछ:

// parameter validation and error checking omitted for clarity 
template<typename T> 
void FromVariant(VARIANT Var, std::vector<T>& Vec) 
{ 
    CComSafeArray<T> SafeArray; 
    SafeArray.Attach(Var.parray); 
    ULONG Count = SafeArray.GetCount(); 
    Vec.resize(Count); 
    for(ULONG Index = 0; Index < Count; Index++) 
    { 
     Vec[Index] = SafeArray[Index]; 
    } 
} 
.... 
std::vector<double> Vec; 
VARIANT Var = ...; 
FromVariant(Var, Vec); 
... 

पाठ्यक्रम चीजों के बालों मिल (स्मृति/जीवन प्रबंधन के संबंध में) यदि सरणी गैर पॉड प्रकार होते हैं, लेकिन यह अभी भी संभव है।

+0

धन्यवाद - यह उपयोगी है, और जो कुछ मैंने खुद को करने के लिए इस्तीफा दे दिया है। जैसा कि आप कहते हैं, गायब क्या है गैर-पीओडी समर्थन है, और शायद चेकिंग/जबरदस्ती टाइप करें (उदाहरण के लिए सब्सियों के एक वेक्टर में युगल का एक रूप परिवर्तित करें)। –

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