#define IMPLEMENTUNKNOWN(ClassName)

AUTOLONG mcRef;

STDMETHODIMP QueryInterface(REFIID riid, void **ppv){

return InterfaceTableQueryInterface(this,

GetInterfaceTable(), riid, ppv);

}

STDMETHODIMP(ULONG) AddRef(void) {

return InterlockedIncrement(&mcRef.value);

}

STDMETHODIMP(ULONG) Release(void) {

ULONG res = InterlockedDecrement(&mcRef.value) ;

if (res == 0)

delete this;

return res;

}

Настоящий заголовочный файл содержит дополнительные макросы для поддержки объектов, не находящихся в динамически распределяемой области памяти.

Для реализации примера PugCat, уже встречавшегося в этой главе, необходимо всего лишь удалить текущие реализации QueryInterface, AddRef и Release и добавить соответствующие макросы:

class PugCat : public IPug, public ICat

{

protected:

virtual ~PugCat(void);

public: PugCat(void);

// IUnknown methods

// методы IUnknown

IMPLEMENTUNKNOWN (PugCat)

BEGININTERFACETABLE(PugCat)

IMPLEMENTSINTERFACE(IPug)

IMPLEMENTSINTERFACE(IDog)

IMPLEMENTSINTERFACEAS(IAnimal,IDog)

IMPLEMENTSINTERFACE(ICat)

ENDINTERFACETABLE()

// IAnimal methods

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату