gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:11:57 28 4
gpt4 key购买 nike

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

更具体地说,我想在 POD 类型(例如 doublelong)、字符串(例如 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 的人一直都这样做,所以很可能会有一个单一方便的库来处理各种转换。但我所能找到的只是各种各样的包装类,每个类都转换几种类型:

除了切换到 Visual Basic 之外,是否有任何简单的方法来避免这种笨拙的内存管理和按位 VT_ARRAY | 的噩梦? VT_I4代码?

相关问题:

最佳答案

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

关于windows - 在 C++ 中与 VARIANT 类型相互转换的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359065/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com