簡體   English   中英

COM對象的動態數組

[英]Dynamic array of COM objects

我有一個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];
}

如果有人對如何實現這一點有任何指示,我將非常歡迎。 一篇關於暴露靜態對象優秀文章 ,但我找不到任何有關特定問題的信息。

是的, std::vector< CComPtr<IChild> >是這樣做的方法 - 你將得到一個動態的IChild*數組,它管理IChild派生對象的生命周期。 一旦你想將IChild*轉換為派生接口,你必須使用QueryInterface() ,就像使用帶有C ++對象的dynamic_cast

沒有CComQIPtr為陣列使用CComQIPtr CComQIPtr的主要用途是在指向可能實現感興趣的接口的對象的指針上調用QueryInterface() 而不是調用QueryInterface()並檢查結果,而是調用CComQIPtr構造函數並檢查結果對象是否包含非空指針。 您可以在使用您的數組的代碼中使用CComQIPtr ,但是將它用於數組本身是沒有意義的。

CComPtr<...>假定您為其分配了兼容的接口。 CComQIPtr<...>調用IUnknown::QueryInterface來獲得正確的接口。 這就是為什么它需要一個額外的GUID作為模板參數。

出於您的目的,您應該使用CComPtr ,因為您知道您將始終使用IChild初始化條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM