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成员函数?

最佳答案

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

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

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

关于c++ - END_COM_MAP中IUnknown成员函数的用途是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1729834/

10-11 00:35