Использование com коллекций написанных на visual basic в c+
От: sammael  
Дата: 27.01.06 06:58
Оценка:
Есть обект коллекция (часть компонента написанного на visual basic)
в basic для доступа к элементам используется конструкция foreach

Объект поддерживает интерфейс IEnumVARIANT
методы
int Count — к-во элементов коллекции
object* Item([in] VARIANT Index);
IUnknown* NewEnum();

пытаюсь воспользоватся из c++:

VARIANT *arrVariant = new VARIANT[countRoutes];
ULONG nReturned = 0;


IEnumVARIANT *varArg;
HRESULT hr = E_UNEXPECTED;
routes1->NewEnum()->QueryInterface(__uuidof(IEnumVARIANT),(void**)&varArg);
//Запрашиваю нужное мне колличество элементов
hr=varArg->Next(countRoutes, arrVariant, &nReturned);
//здесь hr = -2147352568 (неверный тип переменной)


for(int i =0;i<countRoutes;i++)
{
VARIANT v;
v.intVal=i;

CGPSRoute r;
//Здесь происходит исключение
//Текст ошибки: Variable uses an Automation type not supported in Visual Basic
r.AttachDispatch(routes1->Item(v));
}

Мне интересно как оборачивает basic конструкцию foreach
и как можно получить доступ к элементу коллекции из с++
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Использование com коллекций написанных на visual basic
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.01.06 07:23
Оценка:
Здравствуйте, sammael, Вы писали:

S>Есть обект коллекция (часть компонента написанного на visual basic) в basic для доступа к элементам используется конструкция foreach

S>...
S>Мне интересно как оборачивает basic конструкцию foreach и как можно получить доступ к элементу коллекции из с++

Никак не оборачивает: конструкция foreach — это VB'шный доступ к енумератору коллекции (т.е. к интерфейсу IEnumVARIANT), в котором VB перебирает элементы коллекции по одному (т.е. obj->Next(1, &buffer)).

У тебя проблемы с инициализацией VARIANT-ов: перед передачей их в VB, нужно им присвоить какие-нибудь начальные данные.
В первом случае каждому элементу arrVariant присвоить arrVariant[i].vt = VT_EMPTY или вызвать VariantInit(arrVariant + i).
Во втором случае нужно присвоить тип значения в VARIANT v.vt = VT_I4.
Именно поле vt варианта отвечает за то, инициализирован ли он и что хранит. Если там будет случайное число, то и сообщения об ошибках будут разнообразными.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Использование com коллекций написанных на visual bas
От: sammael  
Дата: 27.01.06 09:16
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, sammael, Вы писали:



Vi2>У тебя проблемы с инициализацией VARIANT-ов: перед передачей их в VB, нужно им присвоить какие-нибудь начальные данные.

Vi2>В первом случае каждому элементу arrVariant присвоить arrVariant[i].vt = VT_EMPTY или вызвать VariantInit(arrVariant + i).
Vi2>Во втором случае нужно присвоить тип значения в VARIANT v.vt = VT_I4.
Vi2>Именно поле vt варианта отвечает за то, инициализирован ли он и что хранит. Если там будет случайное число, то и сообщения об ошибках будут разнообразными.

Спасибо, что объяснил
оказалось чуть-чуть подругому:
routes1->NewEnum()->QueryInterface(envar,(void**)&varArg);


for(int i =0;i<countRoutes;i++)
{
CGPSRoute r;
arrVariant.vt=VT_I4;
hr=varArg->Next(1, &arrVariant, &nReturned);

//Раньше здесь обращался к методу Item, теперь понял что в variant
//возвращается Dispatch интерфейс
r.AttachDispatch(arrVariant.pdispVal);
out<<r.get_Number()<<" "<<r.get_Identifier()<<" "<<r.get_Comment()<<" "<<endl;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.