END_COM_MAP da IUnknown aʼzo funksiyalaridan maqsad nima?

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?


person sharptooth    schedule 13.11.2009    source manba


Javoblar (1)


Men ATL dan foydalanganimga bir muncha vaqt bo'ldi, lekin IIRC, CMyClass emas, balki CComObject<CMyClass> ni yaratib beradi.

CComObject IUnknown ni amalga oshiradi va uning shablon parametridan meros oladi.

Tahrirlash: MSDN-dagi "ATL COM ob'ektlari asoslari" sahifasi juda yaxshi. nima bo'layotganini tasvirlaydi.

person Éric Malenfant    schedule 13.11.2009
comment
Va havola qilingan maqolada aytib o'tilganidek, boshqa bir qator CComObjects mavjud. Har bir variatsiya IUnknown xatti-harakatini sozlaydi, QueryInterface yoki umrbod boshqaruv (AddRef/Release). - person Kim Gräsman; 14.11.2009