gpt4 book ai didi

c++ - 通过 COM 发送和接收数组

转载 作者:太空狗 更新时间:2023-10-29 20:29:42 25 4
gpt4 key购买 nike

通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com