COM对象的动态数组

Rob*_*Rob 2 c++ com atl

我有一个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];
}
Run Code Online (Sandbox Code Playgroud)

如果有人对如何实现这一点有任何指示,我将非常欢迎.有一篇关于暴露静态对象优秀文章,但我找不到任何有关特定问题的信息.

sha*_*oth 6

是的,std::vector< CComPtr<IChild> >是这样做的方法 - 你将得到一个动态数组IChild*来管理IChild衍生对象的生命周期.一旦想要转换IChild*为派生接口,就必须使用QueryInterface()与使用dynamic_castC++对象相同的方法.

没有必要使用CComQIPtr阵列.主要用途CComQIPtr是有一种方便的方法来调用QueryInterface()指向可能实现感兴趣的接口的对象的指针.您不必调用QueryInterface()和检查结果,而是调用CComQIPtr构造函数并检查结果对象是否包含非空指针.您可以CComQIPtr在使用您的数组的代码中使用,但是将它用于数组本身是没有意义的.

  • 实际上,从MSVS2010开始,它必须是`std :: vector <CAdapt <CComPtr <IChild >>>`因为不幸的运算符和过载:http://blogs.msdn.com/b/vcblog/archive/2009/ 5月25日/ STL-磨合的变化,在视觉工作室-2010-β-1.aspx (2认同)