Есть обект коллекция (часть компонента написанного на 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>>
Здравствуйте, 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>>