Какова цель функций-членов IUnknown в END_COM_MAP? - PullRequest
0 голосов
/ 13 ноября 2009

Макрос 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 объявлены здесь?

1 Ответ

5 голосов
/ 13 ноября 2009

Прошло много времени с тех пор, как я использовал ATL, но, IIRC, в итоге создается не CMyClass, а CComObject<CMyClass>.

CComObject реализует IUnknown и наследует от своего параметра шаблона.

Edit: страница " Основы COM-объектов ATL " на MSDN прекрасно иллюстрирует происходящее.

...