程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> ATL開發技巧之一(集合對象的實現)

ATL開發技巧之一(集合對象的實現)

編輯:關於VC++

通常對象集合時要用到枚舉器,但枚舉器的實現主要是為了集合對象的訪問控制,我們可以用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、示例說明:

以上組件編譯注冊後,在使用時應避免超計數范圍的子對象使用。

使用前請先為集合對象添加子對象實例,再調用之,這也符合一般編程方法。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved