聚合 包容 COM

来源:互联网 发布:冠军教父数据 编辑:程序博客网 时间:2024/06/11 00:34

//聚合

 

//定义集合的CLSID和IID定义的头文件

#include "../MyAtl/ATLServer_i.c"


//初始化指针
    CMyMath():m_pITargetUnknown(0)
    {
    }

 

//得到关于GetControllingUnknown的编译器错误信息
    DECLARE_GET_CONTROLLING_UNKNOWN()

 



BEGIN_COM_MAP(CMyMath)

//将被集合的接口添加到接口映射中
    COM_INTERFACE_ENTRY_AGGREGATE(IID_ITarget, m_pITargetUnknown)
END_COM_MAP()




 
//覆盖FinalConstruct接口
    HRESULT FinalConstruct()
    {

       HRESULT hr = CoCreateInstance(CLSID_Target/*目标类的CLSID*/,
            GetControllingUnknown(),
            CLSCTX_INPROC_SERVER,
            IID_IUnknown/*目标类的IID_IUnknown*/,
            (void**)&m_pITargetUnknown);
        return S_OK;
    }


//释放被集合的组件

    void FinalRelease()
    {
        if(m_pIMathUnknwon)
            m_pITargetUnknown->Release();
    }

 

//定义目标接口的IUnknown接口指针

private:
    IUnknown* m_pITargetUnknown;

 

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

 

//包容

 

//导入包容类的头文件

#include “Target.h”



//在类声明中添加包容的接口
class ATL_NO_VTABLE CNowClass :
   ……,

   ……,

   public IMath


{

//初始化指针
public:
   CAdvancedMath() : m_pTarget( 0 )
   {
   }

 

//覆盖FinalConstruct接口

   HRESULT FinalConstruct()
   {
      HRESULT hr = CoCreateInstance( CLSID_Target,
                                0,
                                CLSCTX_INPROC_SERVER,
                                IID_ITarget,
                                (void**) &m_pTarget );       
      return hr;
   }

 


//释放被包容的组件
   void FinalRelease()
   {
      if ( m_pTarget )
         m_pTarget();
   }



BEGIN_COM_MAP(CNowClass)

    COM_INTERFACE_ENTRY(INowClass)
//响应包容的接口

   COM_INTERFACE_ENTRY(ITarget)
END_COM_MAP()




//定义目标接口的 指针
private:
   ITarget* m_pTarget;

};

//对包容的接口要添加使用方法

STDMETHOD(methodName)( parameter list);//声明

STDMETHODIMP CNowClass::methodName(parameter list)
{
   return
m_pTarget->xxx/*包容接口的方法*/(parameter list/*相应的参数列表*/)];
}