Сущность технологии COM



Множественные интерфейсы и имена методов - часть 9


Два новых макроса, использованных в определении класса, определяются следующим образом:

// inttable.h // (book-specific header file) // (заголовочный файл, специфический для данной книги)

#define COMPOSITE_OFFSET(ClassName, BaseName, \ MemberType, MemberName) \ (DWORD(static_cast<BaseName*>(\ reinterpret_cast<MemberType*>(0x10000000 + \ offsetof(ClassName, MemberName)))) - 0х10000000)

#define IMPLEMENTS_INTERFACE_WITH_COMPOSITE(Req,\ MemberType, MemberName) \ { &IID_##Req,ENTRY_IS_OFFSET, COMPOSITE_OFFSET(_IT,\ Req, MemberType, MemberName) },

// impunk.h // (book-specific header file) // (заголовочный файл, специфический для данной книги)

#def1ne IMPLEMENT_COMPOSITE_UNKNOWN(OuterClassName,\ InnerClassName, DataMemberName) \ OuterClassName *This() \ { return (OuterClassName*)((char*)this - \ offsetof(OuterClassName, DataMemberName)); }\ STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\ { return This()->QueryInterface(riid, ppv); }\

STDMETHODIMP_(ULONG) AddRef(void) \ { return This()->AddRef(); }\ STDMETHODIMP_(ULONG) Release(void) \ { return This()->Release(); }

Эти макросы препроцессора просто дублируют фактические реализации QueryInterface, AddRef и Release, использованные в композиции.




Содержание  Назад  Вперед