[英]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.