有问题获取idl声明与指向吸气剂的矢量指针

时间:2013-11-13 14:27:15

标签: c++ visual-c++ com

我试图在属性getter的IDL规范中指定一个向量。 我是C ++的新手所以请耐心等待。对象IThis是任何事物的假设对象。 我在id声明中得到一个编译错误,期望一个类型说明符。非常感谢!!!!!!!!!!!!!!!

STDMETHOD(get_ThisList)(vector<IThis*> *value) 
{
   *value = mThisList;
   return S_OK;   
}

vector<IThis*> mThisList;

[propget] IDLAPI ThisList([out,retval] vector<IThis*>* value);

2 个答案:

答案 0 :(得分:2)

您不能在COM接口中使用vector,IDL或其他方式。你可以返回一个接口指针的safearray;它看起来像这样:

// In IDL
[propget]
HRESULT ThisList([out,retval] SAFEARRAY(IThis*)* value);

// In C++
HRESULT get_ThisList(SAFEARRAY** value);

其他替代方案包括conformant array(虽然这对于自动化界面是不可取的,如您所见),以及表示对象列表的单独集合对象。

get_ThisList的实现可能如下所示:

STDMETHODIMP MyObject::get_ThisList(SAFEARRAY** value) {
  if (!value) return E_POINTER;

  SAFEARRAYBOUND bound = {mThisList.size(), 0};
  *value = SafeArrayCreate(VT_UNKNOWN, 1, &bound);

  IUnknown** data;
  SafeArrayAccessData(*value, (void**)&data);
  for (int i = 0; i < mThisList.size(); ++i) {
    (data[i] = mThisList[i])->AddRef();
  }
  SafeArrayUnaccessData(*value);
  return S_OK;
}

错误处理留给读者练习。

答案 1 :(得分:0)

std :: vector是一个C ++类; IDL(接口定义语言 - 不同语言)没有它的概念。

“期望类型说明符”意味着IDL编译器不会将std :: vector识别为类型。

您必须返回一个指向IThis数组的指针作为返回值,并将其放入调用者站点的更智能的对象中。