还有,代理未知接口 非代理未知接口 这都是干什么的?
哪位高手给用简短语言阐述一下啊 谢谢

解决方案 »

  1.   

    组件的聚合 pUnkOuter,
    如果pUnkOuter为NULL,非聚合。
    pUnkOuter不为空,这就是聚合。
    一个支持聚合的组件需要处理pUnkOuter为空和非空两种情况,组件在内部保存pUnkOuter,
    不为空是QueryInterface, AddRef, Release 都是调用pUnkOuter的相应接口,为空时就直接调用内部实现了此时pUnkOuter = this;
      

  2.   

    为支持聚合,内部组件需要实现两个IUnknown接口,分别为非代理未知接口(Nondelegating IUnknown)与代理未知接口(Delegating IUnknown)。
    当组件未被聚合时,代理未知接口将把所有调用转发给非代理未知接口,也就是两者对客户程序来说没任何区别,就是一个接口。
    但是当组件被聚合了,那么代理未知接口将把调用转发给外部组件所实现的IUnknown接口,此时对客户程序来说,外部与内部组件共用同一个IUnknown的实现。并且内部组件的非代理未知接口此时只能由外部组件操纵,客户程序不能直接访问该接口。
      

  3.   

    非代理未知接口就是原本的IUnknown接口,它是直接跟该组件交流的。代理接口,顾名思义,代理而已。它只是将调用转发,而不是跟组件直接交涉。
      

  4.   

    如果组件被聚合了,内部组件还实现了ATL的连接点,那么当客户代码创建了一个外部组件实例,并做了一个接收器接收内部组件的事件,请问如何连接到内部组件的连接点?DispEventAdvise(IUnknown *pUnk) 的参数pUnk应该传递什么?
      

  5.   

    class ATL_NO_VTABLE CTest: 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<Test, &CLSID_Test>,
    public IDispatchImpl<CTest, &IID_ITestv, &LIBID_SERVERLib>
    {
    public:
    CWzdSrv()
    {
    m_pUnknown=NULL;
    } HRESULT FinalConstruct( )
    {
    HRESULT hr=::CoCreateInstance(CLSID_Dele, 
    GetControllingUnknown(), CLSCTX_ALL,
    IID_IUnknown, (LPVOID*)&m_pUnknown);
    return hr;
    }BEGIN_COM_MAP(CWzdSrv)
    COM_INTERFACE_ENTRY(IWzdSrv)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY_AGGREGATE(IID_IWzdAgSvr,m_pUnknown)
    END_COM_MAP()private:
    LPUNKNOWN m_pUnknown;//////////////
    这个类就聚合了CDele