com组件类厂

实际在创建组件过程中,CoCreateInstance(CLSID,IUNKNOWN*,context,const IID&,void**)调用DllGetClassObject(const CLSID&,const IID&,void**),该函数返回类厂组件,类厂组件调用组件接口CreateInstance(IUNKNOWN*, const IID&, void**)返回对应组件。

//CoCreateInstance示例

HRESULT CoCreateInstance(const CLSID& clsid, IUnKnown* pOuterUnKnown, DWORD dwcontext,const IID& iid, void** pv)

{

         HRESULT hr = DllGetClassObject(clsid, IID_IFACTOYR, pv);

         if(SUCCEED(hr))

         {

                   hr = static_cast<IFactory*>(*pv)->CreateInstance(pOuterUnKnown,iid,pv);

                   static_cast<IFactory*>(*pv)->Release();

                   return hr;

         }

         else

                   return E_FAIL;

}


//产生类厂组件函数,由组件程序员实现

STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void**pv)

{

         if(clsid != CLSID_COMPONENT1)

                   return CLASS_E_CLASSNOTAVAILABLE;

         IFactory* pFactory= new CAIFactory;

         if(NULL != pFactory)

         {

                   HRESULT hr = pFactory->QueryInterface(iid,ppv);

                   if(SUCCEED(hr))

                   {

                            pFactory->Release();

                            return S_OK;

                   }

                   else

                   {

                            pFactory->Release();

                            return E_FAIL;

                   }

         }

         else

         {

                   return E_OUTOFMEMORY;

         }

}

struct IFactory:public IUnknown//类厂接口,用于创建对应的组件

{

         IFactory() = 0;

         virtual HRESULT CreateInstance(IUnknown* pOutUnknown,const IID& iid, void** pv) = 0;

         ~IFactory() = 0;

};


//具体的类厂由组件程序员实现

struct CAIFactory:public IFactory{

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

         {

                   if(iid == IID_IUnKnown)

                   {

                            *pv = static_cast<IUnknown*>(this);

                            return S_OK;

                   }

                   else if(iid == IID_IFactory)

                   {

                            *pv = static_cast<IFactory*>(this);

                            return S_OK;

                   }

                   else if(iid == IID_CAIFactory)

                   {

                            *pv = static_cast<CAIFactory*>(this);

                            return S_OK;

                   }

                   else

                   {

                            *pv = NULL;

                            return E_FAIL;

                   }

                   static_cast<IUnknown*>(*pv)->AddRef();

         }

        

         void AddRef(){++m_refcnt;}

         void Release()

         {

                   --m_refcnt;

                   if(m_refcnt == 0)

                            delete this;

         }

        

         HRESULT CreateInstance(IUnknown* pOuterKnown, const IID& iid, void** pv)

         {

                   CA* pCA = new CA;

                   if(NULL != pCA)

                   {

                            HRESULT hr = pCA->QueryInterface(iid,pv);

                            if(SUCCEED(hr))

                            {

                                     pCA->Release();

                                     return S_OK;

                            }

                            else

                            {

                                     pCA->Release();

                                     return E_FAIL;

                            }

                   }

                   else

                   {

                            return E_FAIL;

                   }

         }

        

         CAIFactory():m_refcnt(0){}

         ~CAIFactory(){}

        

private:

         int m_refcnt;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值