END_COM_MAP中IUnknown成员函数的用途是什么?

时间:2009-11-13 15:14:20

标签: c++ visual-c++ com atl

ATL END_COM_MAP宏定义如下:

#define END_COM_MAP() \
    __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\
    {NULL, 0, 0}}; return _entries;} \
    virtual ULONG STDMETHODCALLTYPE AddRef( void) throw() = 0; \
    virtual ULONG STDMETHODCALLTYPE Release( void) throw() = 0; \
    STDMETHOD(QueryInterface)(REFIID, void**) throw() = 0;

它旨在用于从COM接口继承的类的定义中,例如:

class ATL_NO_VTABLE CMyClass :
    public CComCoClass<CMyClass, &MyClassGuid>,
    public CComObjectRoot,
    public IMyComInterface
{
public:
    BEGIN_COM_MAP( CMyClass )
        COM_INTERFACE_ENTRY( IMyComInterface)
    END_COM_MAP()
};

这意味着在此类中将QueryInterface(),AddRef()和Release()声明为纯虚拟。由于我没有定义它们的实现,因此该类应该是不可创建的。然而ATL成功地实例化了它。

它是如何工作的,为什么这些IUnknown成员函数在这里被重新声明?

1 个答案:

答案 0 :(得分:5)

自从我使用ATL已经有一段时间了,但是,IIRC,最终被实例化的不是CMyClass,而是CComObject<CMyClass>

CComObject实现IUnknown并继承其模板参数。

编辑:MSDN上的“Fundamentals of ATL COM Objects”页面很好地说明了正在发生的事情。