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/