#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