组件的聚合 迷惑ing 还有,代理未知接口 非代理未知接口 这都是干什么的?哪位高手给用简短语言阐述一下啊 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 组件的聚合 pUnkOuter,如果pUnkOuter为NULL,非聚合。pUnkOuter不为空,这就是聚合。一个支持聚合的组件需要处理pUnkOuter为空和非空两种情况,组件在内部保存pUnkOuter,不为空是QueryInterface, AddRef, Release 都是调用pUnkOuter的相应接口,为空时就直接调用内部实现了此时pUnkOuter = this; 为支持聚合,内部组件需要实现两个IUnknown接口,分别为非代理未知接口(Nondelegating IUnknown)与代理未知接口(Delegating IUnknown)。当组件未被聚合时,代理未知接口将把所有调用转发给非代理未知接口,也就是两者对客户程序来说没任何区别,就是一个接口。但是当组件被聚合了,那么代理未知接口将把调用转发给外部组件所实现的IUnknown接口,此时对客户程序来说,外部与内部组件共用同一个IUnknown的实现。并且内部组件的非代理未知接口此时只能由外部组件操纵,客户程序不能直接访问该接口。 非代理未知接口就是原本的IUnknown接口,它是直接跟该组件交流的。代理接口,顾名思义,代理而已。它只是将调用转发,而不是跟组件直接交涉。 如果组件被聚合了,内部组件还实现了ATL的连接点,那么当客户代码创建了一个外部组件实例,并做了一个接收器接收内部组件的事件,请问如何连接到内部组件的连接点?DispEventAdvise(IUnknown *pUnk) 的参数pUnk应该传递什么? 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 switch重构 c++使用odbc链接数据库,插入多条数据失败 VC 自绘标题栏 问题 如何在一个线程内访问类的公有函数 已经有了lib和dll我这样调dll里面的函数标准吗? CDSN没高手? 关于内存泄漏 大家帮看看,下面的问题出在哪? 请大侠帮忙,如何更改CRichEditCtrl的输入光标/文本光标? Shell里面(Explorer)的右键菜单中,怎样得到所选文件名? Activex 设置回调函数 MFC中对于数据改如何显示?
如果pUnkOuter为NULL,非聚合。
pUnkOuter不为空,这就是聚合。
一个支持聚合的组件需要处理pUnkOuter为空和非空两种情况,组件在内部保存pUnkOuter,
不为空是QueryInterface, AddRef, Release 都是调用pUnkOuter的相应接口,为空时就直接调用内部实现了此时pUnkOuter = this;
当组件未被聚合时,代理未知接口将把所有调用转发给非代理未知接口,也就是两者对客户程序来说没任何区别,就是一个接口。
但是当组件被聚合了,那么代理未知接口将把调用转发给外部组件所实现的IUnknown接口,此时对客户程序来说,外部与内部组件共用同一个IUnknown的实现。并且内部组件的非代理未知接口此时只能由外部组件操纵,客户程序不能直接访问该接口。
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