有没有便于使用, 高级类或库让您可以与VARIANT
在 Visual C++ 中?
更具体地说,我想在 POD 类型之间进行转换(例如double
, long
)、字符串(例如CString
)和容器(例如std::vector
) and VARIANT
s。例如:
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(使用前将#替换为@)