Re[3]: Где взять IID_IAcadEntity
От: andreyVC  
Дата: 09.01.06 08:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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);
А>


Я пытался сделать как написано в этом сообщении, но при компиляции получаю сообщение
error C2065: 'IID_IAcadEntityPtr' : undeclared identifier
Где взять IID_IAcadEntity

Я только начинаю изучать COM, OLE
поэтому наверное это неправильнй вопрос
помогите пожалуйста
заранее благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.