ATL END_COM_MAP makrosi quyidagicha aniqlanadi:
#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;
U COM interfeyslaridan meros bo'lib qolgan sinflar ta'rifida foydalanish uchun mo'ljallangan, masalan:
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()
};
Bu QueryInterface(), AddRef() va Release() bu sinfda sof virtual deb e'lon qilinganligini anglatadi. Men ularni amalga oshirishni aniqlamaganim uchun bu sinf yaratib bo'lmaydigan bo'lishi kerak. Shunga qaramay, ATL buni muvaffaqiyatli amalga oshirdi.
Bu qanday ishlaydi va nima uchun IUnknown a'zo funktsiyalari bu erda qayta e'lon qilingan?