在C ++中转换/从VARIANTtypes的简单方法

是否有任何易于使用 的高级类或库让您可以在Visual C ++中与VARIANT交互?

更具体地说,我想在PODtypes(例如doublelong ),string(例如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> 

我(天真地)认为使用COM的人一直这样做,所以最有可能的是一个简单的来处理各种转换。 但是我所能find的只是各种各样的包装类,每个类都转换成几种types:

  • 用于PODtypes的_variant_t或CComVariant
  • _bstr_t , CComBSTR或BSTRstring
  • 数组的CComSafeArray或SAFEARRAY

有没有简单的方法 – 切换到Visual Basic – 以避免这种尴尬的内存pipe理的恶梦和按位VT_ARRAY | VT_I4 VT_ARRAY | VT_I4代码?

相关问题:

  • CComVariant与_variant_t,CComBSTR与_bstr_t
  • 将VARIANT转换为…?
  • 如何将VARIANT_BOOL转换为C ++ bool?

Solutions Collecting From Web of "在C ++中转换/从VARIANTtypes的简单方法"

那么,大部分的努力工作已经完成了各种包装类。 我更喜欢_variant_t和_bstr_t,因为它们更适合转换为POD类型和字符串。 对于简单的数组,你真正需要的是模板转换功能。 像下面这样:

 // 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); ... 

当然,如果数组包含非POD类型的话,事情会变得多毛(关于内存/生命周期管理),但它仍然是可行的。