我试图在属性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);
答案 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数组的指针作为返回值,并将其放入调用者站点的更智能的对象中。