Есть ли любые простые в использовании, высокоуровневые классы или библиотеки, которые позволяют Вам взаимодействовать с VARIANT
s в Visual C++?
Строго говоря, я хотел бы преобразовать между типами POD (например. double
, long
), строки (например. CString
), и контейнеры (например. std::vector
) и VARIANT
s. Например:
long val = 42;
VARIANT var;
if (ToVariant(val, var)) ... // tries to convert long -> VARIANT
comObjPtr->someFunc(var);
std::vector vec;
VARIANT var = comObjPtr->otherFunc();
if (FromVariant(var, vec)) ... // tries VARIANT -> std::vector
Я (наивно?) предположил, что люди, работающие с 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, но это все еще выполнимо.