在 C++ 中与 VARIANT 类型相互转换的简单方法

2024-04-22

有没有便于使用, 高级类或库让您可以与VARIANT在 Visual C++ 中?

更具体地说,我想在 POD 类型之间进行转换(例如double, long)、字符串(例如CString)和容器(例如std::vector) and 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 的人总是这样做,所以很可能会有一个单一便捷图书馆处理各种转换。但我所能找到的只是各种各样的包装类,每个类都转换几种类型:

  • _variant_t http://msdn.microsoft.com/en-us/library/x295h94e(VS.80).aspx or CCom变体 http://msdn.microsoft.com/en-us/library/ac97df2h(VS.80).aspx对于 POD 类型
  • _bstr_t http://msdn.microsoft.com/en-us/library/zthfhkd6(VS.80).aspx, CComBSTR http://msdn.microsoft.com/en-us/library/zh7x9w3f.aspx, or BSTR http://msdn.microsoft.com/en-us/library/ms221069.aspx对于字符串
  • CComSafeArray http://msdn.microsoft.com/en-us/library/3xzbsee8(VS.80).aspx or 安全阵列 http://msdn.microsoft.com/en-us/library/ms221482.aspx对于数组

有没有任何简单的方法(无需切换到 Visual Basic)来避免这种尴尬的内存管理和按位的噩梦VT_ARRAY | VT_I4 code?

相关问题:

  • CComVariant 与 _variant_t、CComBSTR 与 _bstr_t https://stackoverflow.com/questions/2288834/ccomvariant-vs-variant-t-ccombstr-vs-bstr-t
  • 将 VARIANT 转换为...? https://stackoverflow.com/questions/606527/convert-variant-to
  • 如何最好地将 VARIANT_BOOL 转换为 C++ bool? https://stackoverflow.com/questions/886729/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 类型,事情就会变得很复杂(就内存/生命周期管理而言),但它仍然是可行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中与 VARIANT 类型相互转换的简单方法 的相关文章

随机推荐