加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 在C中转换为VARIANT类型的简单方法

发布时间:2020-12-14 02:21:12 所属栏目:Windows 来源:网络整理
导读:是否有任何易于使用的高级类或库可以让您与Visual C中的VARIANT进行交互? 更具体地说,我想在POD类型(例如,double,long),字符串(例如CString)和容器(例如std :: vector)和VARIANT之间进行转换.例如: long val = 42;VARIANT var;if (ToVariant(val,var)) ...
是否有任何易于使用的高级类或库可以让您与Visual C中的VARIANT进行交互?

更具体地说,我想在POD类型(例如,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>

我(天真地?)假设与COM一起工作的人一直这样做,所以最有可能是一个方便的库来处理各种转换.但是我能找到的所有内容都是各种各样的包装类,每个类都转换为几种类型:

> _variant_t或CComVariant用于POD类型
> _bstr_t,CComBSTR或BSTR表示字符串
> CComSafeArray或SAFEARRAY用于阵列

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

相关问题:

> CComVariant vs. _variant_t,CComBSTR vs. _bstr_t
> Convert VARIANT to…?
> How to best convert VARIANT_BOOL to C++ bool?

解决方法

好吧,大多数艰苦的工作已经为你完成了各种包装类.我更喜欢_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类型,事情会变得毛茸茸(关于内存/生命周期管理),但它仍然可行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读