com组件的包容

多个组件可以组成一个组件用于向外部提供服务,这多个组件的组合方式分为包容和聚合,包容是指一个组件作为外部组件,包含内部组件,并且把外部组件的调用转发给内部组件,包容的例子如下:

struct IUnKnown{

    virtual HRESULT  QueryInterface(const IID& iid, void ** ppv) = 0;

         virtual ULONG AddRef() = 0;

         virtual ULONG Release() = 0;

};


//interface IX, assume iid is IID_IX

struct IX :public IUnKnown{

         virtual void Fx()=0;

};


//interface IY, assume iid is IID_IY

struct IY:public IUnKnown{

         virtual void Fy() = 0;

};


class CA:public IX, public IY{

public:

         HRESULT QueryInterface(const IID& iid, void** ppv)

         {

                   if(iid == IID_IUnknown)

                            *ppv = static_cast<IX*>(this);

                   else if(iid == IID_IX)

                            *ppv = static_cast<IX*>(this);

                   else if(iid == IID_IY)

                   //component1组件的客户请求IID_IY组件时,返回component1的IY接口

                            *ppv = static_cast<IY*>(this);

                   else if(iid == IID_CA)

                            *ppv = static_cast<CA*>(this);

                   else

                            {

                                     *ppv = 0;

                                     return 0;

                            }

                   AddRef();

                   return 1;

         }

        

         ULONG AddRef()

         {

                   return ++m_refc;

         }

        

         ULONG Release()

         {

                   if(0 == --m_refc)

                            delete this;

                   return m_refc;

         }

        

         void Fx(){::std::cout<< "fx"<<::std::endl;}

         void Fy(){m_pIY->Fy();}

         //component1组件的客户请求IID_IY的函数,将其转发给内部组件component2

        

private:

         ULONG m_refc;

         IY* m_pIY;

public:

         CA(){m_refc=0; m_pIY = NULL;}

         virtual ~CA()

         {

                   if(NULL!=m_pIY)

                   {

                            m_pIY->Release();

                            m_pIY = NULL;

                   }

         }

         //component1组件在创建后在内部创建component2组件

         HRESULT Init()

         {

                   HRESULT hr = ::CoCreateInstance(

                   CLSID_component2,NULL,CLSCTX_INPROC_SERVER,IID_IY,&m_pIY);

                   if(succeed(hr))

                   {

                            return S_OK;

                   }

                   else

                   {

                            m_pIY = NULL;

                            return E_FAIL;

                   }

         }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值