【问题标题】:Dynamic array of COM objectsCOM 对象的动态数组
【发布时间】:2011-01-20 03:00:50
【问题描述】:

我有一个 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,但我找不到任何关于手头特定问题的信息。

【问题讨论】:

    标签: c++ com atl


    【解决方案1】:

    是的,std::vector&lt; CComPtr&lt;IChild&gt; &gt; 是这样做的方法 - 您将获得一个动态数组 IChild*,它管理 IChild 派生对象的生命周期。一旦您想将IChild* 转换为派生接口,您必须使用QueryInterface(),就像使用dynamic_cast 和C++ 对象一样。

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

    【讨论】:

    【解决方案2】:

    CComPtr&lt;...&gt; 假定您为其分配了一个兼容的接口。 CComQIPtr&lt;...&gt; 调用 IUnknown::QueryInterface 以获取正确的接口。这就是为什么它需要一个额外的GUID 作为模板参数。

    出于您的目的,您应该使用CComPtr,因为您知道您将始终使用IChild 初始化条目。

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2013-10-04
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2011-07-05
      相关资源
      最近更新 更多