C++ 什么';在END\u COM\u MAP中,IUnknown成员函数的用途是什么?

C++ 什么';在END\u COM\u MAP中,IUnknown成员函数的用途是什么?,c++,visual-c++,com,atl,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 UL

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()
};
类ATL\u NO\u VTABLE CMY类:
公共课程,
公共ccombjectroot,
公共IMyComInterface
{
公众:
开始COM映射(CMyClass)
COM_接口_条目(IMyComInterface)
END_COM_MAP()
};
这意味着QueryInterface()、AddRef()和Release()在此类中声明为纯虚拟。因为我没有定义它们的实现,所以这个类应该是不可创建的。然而ATL成功地实例化了它


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

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

ccombject
实现
IUnknown
并从其模板参数继承


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

我已经有一段时间没有使用ATL了,但是,IIRC,最终被实例化的不是
CMyClass
,而是
ccombject

ccombject
实现
IUnknown
并从其模板参数继承


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

还有大量其他cMobject,如参考文章中所述。每种变体都定制IUnknown行为,查询接口或生命周期管理(AddRef/Release)。还有大量其他CComobject,如参考文章中所述。每个变体定制IUnknown行为,查询接口或生命周期管理(AddRef/Release)。