diff options
Diffstat (limited to 'network/wlan/ihvsampleui/iunk.h')
| -rw-r--r-- | network/wlan/ihvsampleui/iunk.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/network/wlan/ihvsampleui/iunk.h b/network/wlan/ihvsampleui/iunk.h new file mode 100644 index 00000000..9b8242c5 --- /dev/null +++ b/network/wlan/ihvsampleui/iunk.h @@ -0,0 +1,54 @@ +// +// Copyright (C) Microsoft Corporation 2005 +// IHV UI Extension sample +// + +// Common macro based implementation of IUnknown +// using a interface table approach + +#define IMPLEMENT_REFCOUNT()\ + ULONG m_crefCount;\ + \ + STDMETHODIMP_(ULONG) AddRef(void)\ + {\ + return InterlockedIncrement((PLONG)&m_crefCount);\ + }\ + \ + _At_(this, __drv_aliasesMem)\ + STDMETHODIMP_(ULONG) Release(void)\ + {\ + ULONG res = InterlockedDecrement((PLONG)&m_crefCount);\ + if (res == 0)\ + {\ + delete this;\ + }\ + return res;\ + } + +#define BEGIN_INTERFACE_TABLE()\ + IMPLEMENT_REFCOUNT()\ + STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)\ + {\ + if (riid == IID_IUnknown)\ + {\ + *ppvObject = reinterpret_cast<IUnknown*>(this);\ + } + +#define IMPLEMENTS_INTERFACE(Itf)\ + else if (riid == IID_ ## Itf)\ + {\ + *ppvObject = static_cast<Itf*>(this);\ + } + +#define END_INTERFACE_TABLE()\ + else \ + {\ + *ppvObject = NULL;\ + return E_NOINTERFACE;\ + }\ + \ + reinterpret_cast<IUnknown *>(*ppvObject)->AddRef();\ + \ + return S_OK;\ + } + |
