聚合实现的示意图

    技术2022-05-11  74

    以前学《COM技术内幕》的时候,对聚合的一个总结:    

    代码如下: 

    外部组件创建后,接着创建内部组件 

    IUnknown* pUnknownOuter = this; // this的值为&CA 

    CoCreateInstance(CLSID_CB, 

    pUnknownOuter, 

    CLSCTX_INPROC_SERVER, 

    IID_IUnknown, 

    (void**)&m_pUnknownInner); 

    m_pUnknownInner为外部组件的成员 

    调用下面的函数 

    {  

    IClassFactory* pIFactory = NULL; 

    CoGetClassObject(CLSID_IB, 

    CLSCTX_INPROC_SERVER, 

    NULL, 

    IID_IClassFactory, 

    (void**)&pIFactory); 

    pIFactory->CreateInstace(pUnknownOuter, iid, ppv); 

    } 

     

    CreateInstace(IUnknown* pUnknownOuter, const IID& iid, void** ppv) 

    { 

    //只能被IID_IUnknown接口聚合 

    if ((pUnknownOuter != NULL) && (iid != IID_IUnknown))   

    { 

      return CLASS_E_NOAGGREGATION ; 

      } 

    CB* pB = new(pUnknownOuter); 

    pB->NonQueryInterface(iid,ppv); 

    } 

    CB::NonQueryInterfacer(IID& iid, void** ppv) 

    { 

    if (iid = IID_IUnknown) 

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

    } 

     

    实际上CB的构造函数是这样的: 

    CB::CB(IUnknown* pUnknownOuter) : m_cRef(1) 

    {  

     ::InterlockedIncrement(&g_cComponents) ;  

     if (pUnknownOuter == NULL) //不使用聚合,转换成非委托接口 

     { 

      m_pUnknownOuter = reinterpret_cast<IUnknown*> 

       (static_cast<INondelegatingUnknown*> 

       (this)) ; 

     } 

     else 

     { //使用聚合 转换成外部接口 

      m_pUnknownOuter = pUnknownOuter ; 

     } 

    } 


    最新回复(0)