2

我正在尝试在属性 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);
4

2 回答 2

3

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

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

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

其他替代方案包括一个一致的数组(尽管这对于自动化接口来说是不可取的,就像你的那样),以及一个表示对象列表的单独集合对象。

的实现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;
}

错误处理留给读者练习。

于 2013-11-13T14:37:04.367 回答
0

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

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

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

于 2013-11-13T14:33:42.317 回答