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成员函数在这里重新声明?
还有一些其他的CComObjects,正如在引用的文章中提到的。每个变体定制IUnknown行为,QueryInterface或生命周期管理(AddRef/Release)。 – 2009-11-14 14:56:44