Показать сообщение отдельно
Старый 20.09.2010, 12:13   #7  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Подкинули задачку, как выяснилось, она решаема. Написано это все для 3ки, для 4ки и 2009 есть смысл использовать класс BinData - там все проще.
Так вот. Неважно, в каком виде мы помещаем в массив значения, то ли Types::Enum, то ли Types::Integer.
Главное - как мы потом запихнем это в правильно инициализированный Variant.
CreateFromArray - не подходит, т.к. проблема на самом деле в том, что createFromArray всегда формирует SafeArray из VT_I4(если мы передаем числовые типы, если строки - то будет VT_BSTR), в результате чего, сервер получает значения "расширенные" 3мя нулями и у него сносит крышу (пропадают спецсимволы и вообще, творится армагеддон ). Надо брать метод safeArray, позволяющий указать тип получаемого SaleArray (а нам нужен, по сути, массив байт). Так и пишем:
X++:
    str         string = "+1&2+3&4";
    COMVariant  cv;
    Array       ar = new Array(Types::Enum); //или Types::Integer
    int         i;
    for (i=1;i<strlen(string);i++)
    {
        ar.value(i, char2num(string, i));
    }
    cv = new ComVariant(COMVariantInOut::Out, COMVariantType::VT_SAFEARRAY);
    cv.safeArray(ar, COMVariantType::VT_I1);
На выходе получим то, что нужно - массив двоичных однобайтовых данных, упакованный в SafeArray.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...

Последний раз редактировалось Maximin; 20.09.2010 в 13:07.
За это сообщение автора поблагодарили: Hyper (1).