精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>资料汇编----------藏经阁>>ATL接口映射宏详解>>ATL接口映射宏详解--(9)

主题:ATL接口映射宏详解--(9)
发信人: mrcloud()
整理人: mrcloud(2000-08-24 02:04:01), 站内信件
发信人: lostall (鸟人+衰人+猪), 信区: COM_DCOM
标  题: ATL接口映射宏详解--(9)
发信站: 武汉白云黄鹤站 (Mon Apr  3 22:18:04 2000), 站内信件

九、COM_INTERFACE_ENTRY_CHAIN(classname)        参ATL例程COMMAP

先看看它的定义:
#define COM_INTERFACE_ENTRY_CHAIN(classname)\
        {NULL,\
        (DWORD)&_CComChainData::data,\
        _Chain},

典型用法:
class CChain :
        public IDispatchImpl,
        public ISupportErrorInfo,
        public CComObjectRoot
        public CComCoClass
{
        ........
};
它与一般的组件无异。
class COuter :
        public CChain,
        ....
{
BEGIN_COM_MAP(COuter)
        ......
        COM_INTERFACE_ENTRY_CHAIN(CChain)
END_COM_MAP()
};

我们对查询的过程已经很熟悉了,可以直接来看看_Chain的功能。
_Chain()是CComObjectRootBase的成员函数:
static HRESULT WINAPI _Chain(void* pv, REFIID iid, void** ppvObject,DW
ORD dw)
{
        _ATL_CHAINDATA* pcd = (_ATL_CHAINDATA*)dw;
        void* p = (void*)((DWORD)pv + pcd->dwOffset);
        return InternalQueryInterface(p, pcd->pFunc(), iid, ppvObject)
;
}
struct _ATL_CHAINDATA
{
        DWORD dwOffset;
        const _ATL_INTMAP_ENTRY* (WINAPI *pFunc)();
};
我们再看看宏定义中的dw部分:
template 
_ATL_CHAINDATA _CComChainData::data =
        {offsetofclass(base, derived), base::_GetEntries};
基本上我们已经看懂是怎么回事了,void *p将得到基类的指针,InteralQueryIn
terface
我们已经很熟悉了,_Chain把基类的指针以及基类的接口映射宏传给它,实际上
是查询
基类的接口!!!

一般情况下把这个宏放在BEGIN_COM_MAP和END_COM_MAP之间的最后面,这表示只
有在当
前类中查不到接口时才去查父类的接口。不过也经常把它放在第一位,这时就是
先去查
父类接口,只有父类没有实现这种接口时才查自己。在ATL中组件是以多重继承的
方式实
现的,ATL定义了很多类实现了一些常用的接口,这些类经常被做为组件的基类,
所以这
个宏被大量使用。


                -----------未完待续----------
--
才疏学浅,胡言乱语;不对之处,敬请指正。



                路漫漫兮,其修远。
                吾将上下而求索。

※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.1.217]


--
...我是在黑夜里展翅飞翔的恐怖...

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: ppp151-16-109-2]

[关闭][返回]