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

标签 c++ com variant safearray

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

相关文章:

c++ - 为什么没有提供 std::regex_traits<char32_t> 的定义(因此没有提供 std::basic_regex<char32_t>)?

c# - 防止 Excel 退出

c# COM 对象 & "The value of ESP was not properly saved across a function call..."

c++ - 如何在具有模板函数的类中使用类型安全的 union (变体)?

c++ - 警告 : deprecated conversion from string constant to ‘ACE_TCHAR*’

c++ - 如何在不编译的情况下执行 C++ 代码?

c++ - Visual Studio 2017,智能感知不工作

c++ - 从另一个进程访问 STA 对象时出现问题

c++ - 使用变体时,模板化的 child 不被接受为 parent

c++ - 如何在不进行强制转换的情况下调用变体上的函数