C++ 什么';在END\u COM\u MAP中,IUnknown成员函数的用途是什么?
ATL END_COM_MAP宏定义如下: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
#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)。