Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа с VARIANT


Автор: Rage 13.7.2007, 17:04
  Доброго времени суток всем! Без предисловий перейду сразу к сути:
  Нужно каким-то образом получить из переменной одного из следующих типов ( int, double, bool,
  std::string)
  переменную типа VARIANT, и обратно, имея VARIANT получить int, double, и т.д.
  Я никогда не работал с VARIANT. В MSDN по этому поводу даже примеров толковых  не нашёл.
  Подскажите, пожалуйста, как выполнить такие преобразования. 
  Заранее спасибо!!! smile 

Автор: Fazil6 13.7.2007, 17:16
cм. comutil.h
там есть класс _variant_t - обертка для варианта.
Там все необходимые конструкторы и операторы преобразования

Автор: Rage 13.7.2007, 17:20
Я бы с удовольствием воспользовался вашим советом, но мне НУЖНО(только не спрашивайте зачем) работать именно с VARIANT.
К тому же я не очень хорошо понимаю, что такое обёртка.  smile 
Мне бы посмотреть примеры конструкций, я бы разобрался.

Автор: JackYF 13.7.2007, 20:23
Цитата(Rage @  13.7.2007,  17:20 Найти цитируемый пост)
работать именно с VARIANT

а у меня тупой вопрос: что такое VARIANT? и откуда.

Автор: zkv 13.7.2007, 21:35
Цитата(Rage @  13.7.2007,  17:04 Найти цитируемый пост)
В MSDN по этому поводу даже примеров толковых  не нашёл.

ну там показывать просто особо нечего.
Код

#include <iostream>
#include <windows.h>

std::ostream &operator<<( std::ostream &stream, const VARIANT &var );

int main()
{
    try
    {
        VARIANT vVar;

        vVar.vt = VT_R4;
        vVar.fltVal = 3.14f;    
        std::cout<<vVar<<'\n';

        vVar.vt = VT_BOOL;
        vVar.boolVal = true;    
        std::cout<<vVar<<'\n';

        vVar.vt = VT_BSTR;
        vVar.bstrVal = SysAllocString( L"String for test" );
        std::cout<<vVar<<'\n';
        SysFreeString( vVar.bstrVal );

        vVar.vt = VT_ARRAY;
        vVar.boolVal = true;    
        std::cout<<vVar<<'\n';
    }
    catch( const char *pcReason)
    {
        std::cout<<"We have caught exception: "<<pcReason<<'\n';
    }
    std::cout<<"Good bye! (Press <Enter>...)"<<'\n';
    std::cin.get();
}

std::ostream &operator<<( std::ostream &stream, const VARIANT &var )
{
    switch( var.vt )
    {
    case VT_R4:
        stream<<var.fltVal;
        break;
    case VT_R8:
        stream<<var.dblVal;
        break;
    case VT_BOOL:
        (var.boolVal) ? stream<<"true" : stream<<"false";
        break;
    case VT_BSTR:
        {
            int iSize = wcslen( var.bstrVal ) + 1;
            char *pcBuff = new char[ iSize ];
            WideCharToMultiByte( CP_ACP, 0, var.bstrVal, -1,
                pcBuff, iSize, NULL, NULL );
            stream<<pcBuff;
            delete []pcBuff;
            break;
        }
    default:
        throw( "Unknown type" );
    }
    return stream;
}

Автор: Rage 13.7.2007, 23:23
Спасибо огромное!!!!!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)