Programming 版 (精华区)

发信人: lofe ()感激生活(), 信区: Programming
标  题: ATL接口映射宏详解--(7)
发信站: 哈工大紫丁香 (Sun Sep  3 08:16:44 2000), 转信

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


先看看这个宏的定义:
#define COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)\
        {&iid,\
        (DWORD)&_CComCacheData<\
                CComAggregateCreator<_ComMapClass, &clsid>,\
                (DWORD)offsetof(_ComMapClass, punk)\
                >::data,\
        _Cache},
先看看它的典型用法:
class CAutoAgg :
        public IDispatchImpl<IAutoAgg, &IID_IAutoAgg, &LIBID_AGGREGLib>,
        public ISupportErrorInfo,
        public CComObjectRoot,
        public CComCoClass<CAutoAgg,&CLSID_CAutoAgg>
{
        ......
};
与一般的组件并无二样。
class COuter :
        public CChainBase,
        public IDispatchImpl<IOuter, &IID_IOuter, &LIBID_COMMAPLib>,
        public CComCoClass<COuter,&CLSID_COuter>
{
BEGIN_COM_MAP(COuter)
        COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IAutoAgg, m_pUnkAutoAgg.p,
                                        CLSID_CAutoAgg)
END_COM_MAP()
        CComPtr<IUnknown> m_pUnkAutoAgg;
};
与宏COM_INTERFACE_ENTRY_AGGREGRATE(_)不同,COuter不用在FinalConstruct中创建聚
集组件。外部组件会自动创建聚集组件!!!
1。
template <class Creator, DWORD dwVar>
_ATL_CACHEDATA _CComCacheData<Creator, dwVar>::data = {dwVar, Creator::Creat
eInstance};
2。
static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD 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 T, const CLSID* pclsid>
class CComAggregateCreator
{
public:
  static HRESULT WINAPI CreateInstance(void* pv, REFIID/*riid*/, LPVOID* 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相比,这个宏似乎更好一些,仅当需要时才会创建
使用更简单。

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

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



                路漫漫兮,其修远。
                吾将上下而求索。
※ 修改:.haojs 于 Sep  3 08:14:20 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.990毫秒