通常對象集合時要用到枚舉器,但枚舉器的實現主要是為了集合對象的訪問控制,我們可以用CComEnumOnSTL模板去定義自己的枚舉器,這樣會涉及復雜的復制策略定義及集合方法實現的定義。
假如我們不使用枚舉器,而僅使用接口數組,集合對象會有一個相對簡單許多的實現,本文將探討這種方法的實現並提供完整的源代碼。
下面針對例子介紹用接口數組實現的集合對象,供大家參考:
集合對象創建類:CvoxSys 接口:IVoxSys 集合對象類:CvoxChs 接口:IVoxChs 子對象類:CvoxCh 接口:IVoxCh
一、關於CVoxCh子對象:
在CvoxCh中添加私有成員變量:
private:
BSTR m_bstrMessage;
在CvoxCh的構造函數中初始化成員變量的值:
CVoxCh()
{
m_bstrMessage = A2BSTR("No inited!");
}
為接口IvoxCh添加BSTR類型屬性:Message
修改get_Message函數:
STDMETHODIMP CVoxCh::get_Message(BSTR *pVal)
{
*pVal = m_bstrMessage;
return S_OK;
}
二、關於CVoxChs集合對象:
在CvoxChs中添加兩個私有成員變量:
private:
CComPtr<IVoxCh> m_arrpCh[160]; //子對象接口數組
long m_nChs; //實例子對象計數
在CvoxChs的構造函數中初始化成員變量的值:
CVoxChs()
{
m_nChs = 0;
}
為接口IvoxChs添加屬性及方法:
//為集合對象添加子對象
[id(1), helpstring("method AddCh")] HRESULT AddCh([out,retval]long* pVal);
//獲得子對象計數
[propget, id(2), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
//獲得子對象接口集
[propget, id(3), helpstring("property Ch")] HRESULT Ch([in]long index, [out, retval]IVoxCh** pVal);
修改AddCh函數:
STDMETHODIMP CVoxChs::AddCh(long* pVal)
{
CVoxCh::CreateInstance(&m_arrpCh[m_nChs]);
m_nChs++;
*pVal = 0;
return S_OK;
}
修改get_Count函數:
STDMETHODIMP CVoxChs::get_Count(long *pVal)
{
*pVal = m_nChs;
return S_OK;
}
修改get_Ch函數:
STDMETHODIMP CVoxChs::get_Ch(long index,IVoxCh** pVal)
{
return m_arrpCh[index].CopyTo(pVal);
}
三、關於CVoxSys集合對象創建類:
在CvoxSys中添加私有成員變量:
private:
CComPtr<IVoxChs> m_spVoxChs;
在CvoxSys中添加實現:
//使用FinalConstruct的原因在於它可以有標准返回值。
HRESULT CVoxSys::FinalConstruct()
{
return CVoxChs::CreateInstance(&m_spVoxChs);
}
在CvoxSys中添加屬性:
//獲得集合對象接口:
[propget, id(1), helpstring("property VoxChs")] HRESULT VoxChs([out, retval] IVoxChs** pVal);
修改get_VoxChs函數:
STDMETHODIMP CVoxSys::get_VoxChs(IVoxChs **pVal)
{
return m_spVoxChs.CopyTo(pVal);
//return S_OK;
}
4、示例說明:
以上組件編譯注冊後,在使用時應避免超計數范圍的子對象使用。
使用前請先為集合對象添加子對象實例,再調用之,這也符合一般編程方法。
本文配套源碼