我有一个ATL COM对象需要公开其他COM对象的集合,因此客户端可以找出集合中有多少对象(通过我可以提供的简单Count
属性)并访问对象使用其索引。这个对象集合是动态的 - 计数是不固定的 - 我不知道构造我的主(父)对象时会有多少(因此我无法在FinalConstruct
中创建这些对象例)。我想要公开的对象只有只读属性。
我想要做的是在第一次需要时以某种方式创建std::vector
个这些对象。我想尽可能使用ATL智能COM指针,所以我不需要手动管理引用计数等,但我不确定我是否应该使用CComPtr
,'CComQIPtr'等。
假设我想要返回的对象被称为IChild
,我希望我能做到这样的事情:
std::vector<CComPtr<IChild> > children;
...
CComPtr<IChild> child;
// Somehow instantiate an IChild?
...
children.push_back(child);
STDMETHODIMP Parent::GetAt(LONG index, IChild** pRet)
{
*pRet = children[index];
}
如果有人对如何实现这一目标有任何指示,我将非常欢迎。有一个excellent article on exposing a static object,但我找不到任何关于手头特定问题的内容。
答案 0 :(得分:6)
是的,std::vector< CComPtr<IChild> >
是这样做的方法 - 您将获得一个动态数组IChild*
来管理IChild
- 派生对象的生命周期。一旦您想将IChild*
转换为派生接口,就必须使用QueryInterface()
,就像使用dynamic_cast
和C ++对象一样。
对阵列使用CComQIPtr
没有意义。 CComQIPtr
的主要用途是使用方便的方法在指向可能实现感兴趣的接口的对象的指针上调用QueryInterface()
。而不是调用QueryInterface()
并检查结果,而是调用CComQIPtr
构造函数并检查结果对象是否包含非空指针。您可以在使用数组的代码中使用CComQIPtr
,但是将它用于数组本身是没有意义的。
答案 1 :(得分:2)
CComPtr<...>
假设您为其分配了兼容的界面。 CComQIPtr<...>
调用IUnknown::QueryInterface
来获取正确的界面。这就是为什么它需要额外的GUID
作为模板参数。
出于您的目的,您应该使用CComPtr
,因为您知道您将始终使用IChild
初始化条目。