Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получение массива из VARIANT переменной 
V
    Опции темы
RastaDja
Дата 15.11.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Здраствуйте!
есть проблема: в VARIANT хранятся какието данные, какие не известно. 
Задача: узнать - данные это массив и какого он типа, или это другие данные.
если это массив сформировать строку mas[0]:mas[1]: ... :mas[n], где mas[i] - эллементы массива.
И соответственно реализовать обратную задаче 37:6: ... :56 -> VARIANT

Спассибо


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 15.11.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Если это массив, то он хранится в виде SAFEARRAY.
Цитата(RastaDja @  15.11.2010,  11:14 Найти цитируемый пост)
если это массив сформировать строку
Это уж сами (надеюсь справитесь  smile )


PM MAIL   Вверх
RastaDja
Дата 15.11.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Код

VARIANT SamVar;                                      // тут массив

LPSAFEARRAY sArrey;
sArrey = SamVar.parray;                          // получаем массив

ULONG el = sArrey->cbElements;            // число элементов в массиве

VARTYPE vt;
SAFEARRAYBOUND sBound;
sBound = sArrey->rgsabound[0];
el = sBound.cElements;

SafeArrayGetVartype(sArrey, &vt);         // получили тип элементов


как мне теперь с этим разобраться? надо элементы массива в строку записать, а как мне создать массив нужного типа, чтоб слить данные из LPSAFEARRAY?

помогите пожалуйста


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 15.11.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  15.11.2010,  17:16 Найти цитируемый пост)
как мне теперь с этим разобраться?
Читать поэлементно (SafeArrayGetElement). Полученные элементы приводить в текстовую форму (можно загнать из в VARIANT вместе с типом и позвать преобразование VARIANT'а к типу BSTR).


PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



я это знаю и сам, спасибо. А можна пример?  smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Цитата

можно загнать из в VARIANT вместе с типом и позвать преобразование VARIANT'а к типу BSTR

как это правельно сделать?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Код

LPSAFEARRAY psaiInOut;
psaiInOut = it->second.parray;
//LONG iVal;
VARIANT iVal;
VariantInit(&iVal);
LONG iLBound;
LONG iUBound;
CComVariant Vari;
hr = SafeArrayGetLBound(psaiInOut, 1, &iLBound);
 if(FAILED(hr))
    return hr;
hr = SafeArrayGetUBound(psaiInOut, 1, &iUBound);
 if(FAILED(hr))
    return hr;
      
for (LONG i = 0; i <= iUBound - iLBound; i++)
{
    hr = SafeArrayGetElement(psaiInOut, &ii, &Vari);
                    
    //    hr = Vari.ChangeType(VT_BSTR);
    

ChangeType выдаёт ошибку, так, как в варианте не строковый тип. Как мне правельно преобразовать данные?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 16.11.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  16.11.2010,  10:45 Найти цитируемый пост)
ChangeType выдаёт ошибку, так, как в варианте не строковый тип.
Он выдаст ошибку, если в SAFEARRAY не VARIANT  smile 
Нужно проверить тип элемента в SAFEARRAY, и если там VARAINT, то копировать как у вас написано. Если же нет, то руками переносить в отдельный VARIANT (по отдельности тип и тело), а потом звать ChangeType.

Возможно есть и что то более прямое, не искал, за отсутствием необходимости  smile 

PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



я уже голову сломал
Код

if((vt ==  VT_R8)){//double
        double* pdbl = new double[el];
        char drhh[100];
        SafeArrayAccessData(sArrey, (void**)&pdbl);
        for(int i = 0; i < el; i++){
            LONG rg = i;
            sprintf(drhh, "%.2f", pdbl[i]);
            retStr += ":";
            retStr += drhh;
        }
        //delete [] pdbl;
    }

а что делать если 2 или 3 мерный?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 16.11.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  16.11.2010,  12:54 Найти цитируемый пост)
а что делать если 2 или 3 мерный? 
Печатать 2х или 3х мерные кубы  smile 
Данные в массиве лежат последовательно (вот только не помню начиная с первого или последнего индекса). Количество индексов и границы по каждому индексу можно прочесть из дескриптора SAFEARRAY'я соответствующей функцией


PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



мне не нравится. можеш помочь считать массив в поток, ато я не могу както smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



пробую так
Код

SAFEARRAY *psa;
psa = it->second.parray;
                
void** ppData;
HRESULT hr;
hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);

if (FAILED(hr)){
    ErrorMessage(L"msg1", hr);
}
                
int sz = 1;
int Dim = SafeArrayGetDim(psa);
LONG ipLBound;
LONG ipUBound;
for(int i = 0; i<Dim; i++){
hr = SafeArrayGetLBound(psa, i, &ipLBound);
hr = SafeArrayGetUBound(psa, i, &ipUBound);
   sz *= (ipUBound - ipLBound + 1);
}
int elemsize = SafeArrayGetElemsize(psa);
sz *= elemsize;

byte* bt = new byte[sz];
SafeArrayAccessData(psa, (void**)&bt);

std::string dt = hex_dump(pbstrR, sz);
MessageBox(NULL, CComBSTR(dt.c_str()), L"dsdsdsd", 1);

но чтото не идёт ХЕЛП smile

Добавлено через 5 минут и 16 секунд
 smile  smile  smile  smile  smile

Добавлено через 5 минут и 44 секунды
поток получился пустым

Добавлено через 6 минут и 23 секунды
а в массива забиты данные 
Код

Dim myArray(10) As Double
For i = 0 To 10
    myArray(i) = i
Next


Добавлено через 10 минут и 52 секунды
и есчё sz - размер равен 8, хотя в массиве 11 элементов  smile  smile 


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Код

for(int i = 0; i<Dim; i++){

заменил на 
Код

for(int i = 1; i<Dim+1; i++){

заработало


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 16.11.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



я вот извлек данные из массива
Код

byte HUGEP* bt = NULL;
SafeArrayAccessData(psa, (void**)&bt);


не подскажите каким образом мне создать новый массив из имеющегося у меня массива байтов bt.?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 16.11.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  16.11.2010,  17:20 Найти цитируемый пост)
каким образом мне создать новый массив
В смысле новый SAFEARRAY или просто массив? В любом случае надо заказать памяти и скопировать туда значения из старого массива (через memcpy например)


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.