COM学习笔记(九):包容

前端之家收集整理的这篇文章主要介绍了COM学习笔记(九):包容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

//Component1是一个实现了两个接口IX和IY的外部组件,但它复用了组件2---组件1所包容的一个内部组件---对IY的实现。

class CA : public IX,public IY{

public:

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

virtual ULONG __stdcall AddRef();

virtual ULONG __stdcall Release();

virtual void __stdcall Fx(){cout<<"Fx"<<endl;}

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

CA();

~CA();

HRESULT Init();

private:

long m_cRef;

IY* m_pIY;

};

CA::CA():m_cRef(1),m_pIY(NULL){

InterlockedIncrement(&g_cComponents);

}

CA::~CA(){

InterlockedDecrement(&g_cComponents);

trace("Destroy self.");

if(m_pIY != NULL) m_pIY->Release();

}

HRESULT CA::Init(){

trace("Create Contained component.");

HRESULT hr = ::CoCreateInstance(CLSID_Component2,NULL,CLSCTX_INPROC_SERVER,IID_IY,(void**)&m_pIY);

if(Failed(hr)){

trace("Could not create contained component.");

return E_FAIL;

}

else{

return S_OK;

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//外部组件的类厂调用新创建组件上的Init()函数

HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknown,const IID& iid,void** ppv){

if(pUnknown != NULL) return CLASS_E_NOAGGREGATION;

CA* pA = new CA;

if(pA == NULL) return E_OUTOFMEMORY;

HRESULT hr = pA->Init();

if(Failed(hr)){

pA->Release();

return hr;

}

hr = pA->QueryInterface(iid,ppv);

pA->Release();

return hr ;

}

//包容的一个主要用途是通过给已有的接口加上一些代码以扩展此接口。

原文链接:https://www.f2er.com/javaschema/285362.html

猜你在找的设计模式相关文章