Простой способ конвертировать в / из типов VARIANT в C ++ - PullRequest
7 голосов
/ 02 марта 2010

Существуют ли простые в использовании , высокоуровневые классы или библиотеки , которые позволяют взаимодействовать с 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<double> vec;
VARIANT var = comObjPtr->otherFunc();
if (FromVariant(var, vec)) ...   // tries VARIANT -> std::vector<double>

Я (наивно?) Предположил, что люди, работающие с COM, делают это постоянно, поэтому, скорее всего, будет единая удобная библиотека , которая обрабатывает все виды преобразований. Но все, что мне удалось найти, - это пестрый ассортимент классов-оболочек, каждый из которых преобразует несколько типов:

Есть ли простой способ - кроме перехода на Visual Basic - избежать этого кошмара неловкого управления памятью и побитового VT_ARRAY | VT_I4 кода?

Похожие вопросы:

1 Ответ

5 голосов
/ 08 марта 2010

Ну, большая часть тяжелой работы уже сделана для вас с различными классами-обертками. Я предпочитаю _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-типы, но это все еще выполнимо.

...