7

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

更具体地说,我想在 POD 类型(例如double, long)、字符串(例如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代码的噩梦?

相关问题:

4

1 回答 1

5

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

于 2010-03-07T22:23:13.963 回答