我有一个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)
如果有人对如何实现这一点有任何指示,我将非常欢迎.有一篇关于暴露静态对象的优秀文章,但我找不到任何有关特定问题的信息.
是的,std::vector< CComPtr<IChild> >是这样做的方法 - 你将得到一个动态数组IChild*来管理IChild衍生对象的生命周期.一旦想要转换IChild*为派生接口,就必须使用QueryInterface()与使用dynamic_castC++对象相同的方法.
没有必要使用CComQIPtr阵列.主要用途CComQIPtr是有一种方便的方法来调用QueryInterface()指向可能实现感兴趣的接口的对象的指针.您不必调用QueryInterface()和检查结果,而是调用CComQIPtr构造函数并检查结果对象是否包含非空指针.您可以CComQIPtr在使用您的数组的代码中使用,但是将它用于数组本身是没有意义的.
| 归档时间: |
|
| 查看次数: |
2923 次 |
| 最近记录: |