精华区 [关闭][返回]

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

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

七、COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)   参ATL例程COM
MAP


先看看这个宏的定义:
#define COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)\
        {&iid,\
        (DWORD)&_CComCacheData<\
CComAggregateCreator<_ComMapClass, &clsid>,\
                (DWORD)offsetof(_ComMapClass, punk)\
                >::data,\
        _Cache},
先看看它的典型用法:
class CAutoAgg :
        public IDispatchImpl,
        public ISupportErrorInfo,
        public CComObjectRoot,
        public CComCoClass
{
        ......
};
与一般的组件并无二样。
class COuter :
        public CChainBase,
        public IDispatchImpl,
        public CComCoClass
{
BEGIN_COM_MAP(COuter)
        COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IAutoAgg, m_pUnkAutoAgg.
p,
                                        CLSID_CAutoAgg)
END_COM_MAP()
        CComPtr m_pUnkAutoAgg;
};
与宏COM_INTERFACE_ENTRY_AGGREGRATE(_)不同,COuter不用在FinalConstruct中
创建聚
集组件。外部组件会自动创建聚集组件!!!
1。
template 
_ATL_CACHEDATA _CComCacheData::data = {dwVar, Creator::Creat
eInstance};
2。
static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, D
WORD dw)
{
        HRESULT hRes = E_NOINTERFACE;
        _ATL_CACHEDATA* pcd = (_ATL_CACHEDATA*)dw;
        IUnknown** pp = (IUnknown**)((DWORD)pv + pcd->dwOffsetVar);
        if (*pp == NULL)        
                hRes = pcd->pFunc(pv, IID_IUnknown, (void**)pp);
        if (*pp != NULL)
                hRes = (*pp)->QueryInterface(iid, ppvObject);
        return hRes;
}
3。
template 
class CComAggregateCreator
{
public:
  static HRESULT WINAPI CreateInstance(void* pv, REFIID/*riid*/, LPVOI
D* ppv
)
  {
        ATLASSERT(*ppv == NULL);
        ATLASSERT(pv != NULL);
        T* p = (T*) pv;
        return CoCreateInstance(*pclsid, p->GetControllingUnknown(),
                CLSCTX_INPROC, IID_IUnknown, ppv);
  }
};
因为_Cache,_CComCacheData,CComAggregateCreator这几个类和函数我们已经在
前面见
过或者见过类似的,所以就不再多讲了。总之我们可以看到,若m_pUnkAutoAgg.
p不为空
则直接查询,否则创建聚集组件。
与宏COM_INTERFACE_ENTRY_AGGREGATE相比,这个宏似乎更好一些,仅当需要时才
会创建
使用更简单。

                -------------未完待续--------------

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



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

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

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

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

[关闭][返回]