通过 COM 接收和发送数组的正确方法是什么?到目前为止,这是我的尝试:包裹在变体中的 double 安全阵列。
//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)
编辑:使用 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;
}
这也失败了;口齿不清的报告
(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>
使用一系列变体会产生相同的错误。
最佳答案
得到这个工作 - 我的代码是这样的(编辑:虽然显然不是没有错误 - 请参阅 Dietrich 的回答):
STDMETHODIMP MyComClass::arraytimestwo(VARIANT in, VARIANT* out)
{
CComSafeArray<double> sa_in;
sa_in.Attach(in.parray);
ULONG size = sa_in.GetCount();
CComSafeArray<double> out_sa;
out_sa.Create(size);
for (long i=0;i<size;i++)
out_sa.SetAt(i,sa_in.GetAt(i)*2);
CComVariant(out_sa).Detach(out);
return S_OK;
}
在 Lisp 中...
(vl-load-com)
(setq n (vlax-create-object "mycomdll.MyComClass"))
(setq sa (vlax-make-safearray vlax-vbDouble '(0 . 1)))
(vlax-safearray-fill sa '(1 2))
(vlax-safearray->list sa)
(vlax-invoke-method n 'arraytimestwo sa 'newvar)
(vlax-safearray->list newvar)
原始尝试中特别错误的地方:
- 需要使用
Detach
方法给out
赋值 - 需要附加到
in.parray
而不是*in.pparray
(不是同一回事)
关于c++ - 通过 COM 发送和接收数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228029/