2010-02-23 71 views
2

我有一個ATL COM對象需要公開其他COM對象的集合,因此客戶端可以找出集合中有多少個對象(通過我可以提供的一個簡單的Count屬性)和訪問對象使用其索引。這個對象集合是動態的 - 計數不是固定的 - 我不知道當我的主(父)對象被構造時會有多少(因此我不能在我的FinalConstruct中創建這些對象)。我想要公開的對象只有只讀屬性。COM對象的動態數組

我想要做的是在第一次需要時創建一個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,但我無法找到關於特定問題的任何信息。

回答

6

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

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

+2

實際上,從MSVS2010開始,它必須是'std :: vector >>,因爲不幸的操作符和重載:http://blogs.msdn.com/b/vcblog/archive/2009 /05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx – mcmcc 2013-03-05 16:49:50

+0

儘管在C++ 11中不需要CAdapt:http://stackoverflow.com/questions/24285016/ do-vectors-of-ccomptr-still-need-cadapt – 2014-06-18 16:03:08

+0

使用ATL :: CComObject的'std :: vector'也可以嗎? – 2015-09-10 13:00:11

2

CComPtr<...>假設您爲其分配了兼容接口。 CComQIPtr<...>調用IUnknown::QueryInterface以獲得正確的界面。這就是爲什麼它需要額外的GUID作爲模板參數。

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