【问题标题】:A simple way to convert to/from VARIANT types in C++一种在 C++ 中与 VARIANT 类型相互转换的简单方法
【发布时间】:2011-01-22 11:27:19
【问题描述】:

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

更具体地说,我想在 POD 类型(例如doublelong)、字符串(例如CString)和容器(例如std::vector)和VARIANTs 之间进行转换。例如:

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 的人一直都在这样做,所以很可能会有一个方便的库来处理各种转换。但我能找到的只是各种各样的包装类,每个类都转换几种类型:

有没有什么简单的方法——除了切换到 Visual Basic——来避免这种尴尬的内存管理和逐位VT_ARRAY | VT_I4 代码的噩梦?

相关问题:

【问题讨论】:

标签: windows visual-c++ variant


【解决方案1】:

嗯,大部分繁重的工作已经通过各种包装类为您完成了。我更喜欢 _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 类型,事情就会变得棘手(关于内存/生命周期管理),但它仍然是可行的。

【讨论】:

  • 谢谢——这很有用,而且我已经放弃了自己要做的事情。就像你说的,缺少的是非 POD 支持,也许还有类型检查/强制(例如,将双精度变量转换为整数向量)。
猜你喜欢
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多