2009-11-13 24 views
0

ATL END_COM_MAP宏被定义如下:END_COM_MAP中的IUnknown成员函数的用途是什么?

#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成员函数在这里重新声明?

回答

5

自从我使用ATL但是IIRC以来,已经有一段时间,实例化的结果不是CMyClass,而是CComObject<CMyClass>

CComObject implements IUnknown并且从其模板参数继承。

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

+0

还有一些其他的CComObjects,正如在引用的文章中提到的。每个变体定制IUnknown行为,QueryInterface或生命周期管理(AddRef/Release)。 – 2009-11-14 14:56:44

相关问题