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