Как правильно получать и отправлять массивы через COM? Вот моя попытка: надежный массив пар, завернутый в вариант.
//takes variant holding safearray of doubles
//returns a similar variant having multipled every element by 2
STDMETHODIMP MyComClass::safearraytimestwo(VARIANT in, VARIANT* out)
{
CComSafeArray<double> sa_in;
sa_in.Attach(*in.pparray);
ULONG size = sa_in.GetCount();
CComSafeArray<double> *out_sa = new CComSafeArray<double>(size);
for (long i=0;i<size;i++)
out_sa->SetAt(i,sa_in[i]*2);
out = new CComVariant(out_sa);
return S_OK;
}
Проблемы:
- в настоящее время компиляция не выполняется в цикле: error C2679: binary '=' : no operator found which takes a right-hand operand of type 'ATL::_ATL_AutomationType<DOUBLE>::_typewrapper' (or there is no acceptable conversion)
edit: решено с использованием SetAt()
вместо operator[]
- Должен ли я объявить out_sa
в куче? Будет ли он освобожден, когда out
будет освобожден (что я могу только предположить, что клиент сделает?)
Любая помощь будет принята с благодарностью!
Редактировать 2: это частичная реализация, которая пытается просто вернуть страховочный массив.
STDMETHODIMP CSpatialNet::array3(VARIANT in, VARIANT* out)
{
CComSafeArray<double> out_sa;
out_sa.Create(2);
out_sa.SetAt(0,1.2);
out_sa.SetAt(1,3.4);
*out = CComVariant(out_sa);
out_sa.Detach();
return S_OK;
}
Это также не помогает; отчеты lisp
(vl-load-com)
(setq n (vlax-create-object "sdnacomwrapper.SpatialNet"))
(setq v (vlax-make-variant 1.0))
(vlax-invoke-method n 'array3 v 'newvar)
; error: ActiveX Server returned an error: The parameter is incorrect
Замена CComSafeArray<double>
массивом вариантов приводит к той же ошибке.