Re[2]: Как передать массив объектов в виде VARIANT
От: Аноним  
Дата: 02.04.04 13:29
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:


PE>В метод приходит вариант с VT = 0x6009.


PE> VT_DISPATCH = 9,

PE> VT_ARRAY = 0x2000,
PE> VT_BYREF = 0x4000,

PE>Посколько пришел VT_BYREF, то надо заглядывать не в array.parray, а array.pparray.


PE>array.pparray->fFeatures равняется 0x450


PE> FADF_DISPATCH 0x0400

PE> FADF_HAVEIID 0x0040
PE> FADF_FIXEDSIZE 0x0010


PE>Т.е. для С++ клиента надо сделать точно такой же Сейфаррей и передать его по ссылке в вариант.



Спасибо за советы, и помощь. Все теперь работает как надо.
Ты меня очень сильно выручил. Возможно, в процессе написания возникнут еще проблемы,
тогда обращусь к тебе, если ты не против.

А ты можешь подробнее описать, как проводил исследование чтобы узнать, какие биты передаются?
Может в будущем мне это поможет.

Для тех, у кого возникнут аналогичные проблемы, вот код, который я написал:

 //создаю массив
 SAFEARRAY* sa;
 sa = SafeArrayCreateVectorEx(VT_DISPATCH,0,1,(void*)&IID_IDispatch);

 //выставляю флаги
 sa->fFeatures = FADF_DISPATCH | FADF_HAVEIID | FADF_FIXEDSIZE;

 //получаю указатель на интерфейс IDispatch у смарт-указателя на IAcadPolyline
 IDispatch* pIAcadEntity;
 hr = Contur->QueryInterface(IID_IAcadEntity,(void **)&pIAcadEntity);
 if (FAILED(hr)) return;

 //добавляю в единственный элемент массива полученный указатель интерфейс
 long idx[1] = {0};
 hr = SafeArrayPutElement(sa,idx,pIAcadEntity);
 if (FAILED(hr)) return;

 //создаю Variant, в который надо обернуть SAFEARRAY для передачи в метод AppendOuterLoop
 VARIANT ConturArray;
 VariantInit(&ConturArray);
 ConturArray.vt = VT_ARRAY|VT_DISPATCH|VT_BYREF;
 ConturArray.pparray = &sa;

 //вызываю проблемный метод, который теперь отлично работает
 hr = iHatch->AppendOuterLoop(ConturArray);
 if (FAILED(hr)) return;

 //зачистка структур в памяти, дело до которой не доходит
 pIAcadEntity->Release();
 SafeArrayDestroy(sa);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.