COM IUnknown接口封装
#include "CAbstractUnknown.h"CAbstractUnknown::CAbstractUnknown(){m_ref=0;g_components=0;}/**HRESULT _stdcall CAbstractUnknown::QueryInterface(const IID& riid,void** ppvObject){if(p_UnknownOuter!=NULL){return p_UnknownOuter->QueryInterface(riid,ppvObject);}else{return NonDelegatingQueryInterface(riid,ppvObject);}}*/ULONG _stdcall CAbstractUnknown::AddRef(){return InterlockedIncrement(&m_ref);}ULONG _stdcall CAbstractUnknown::Release(){if(InterlockedDecrement(&m_ref)==0){InterlockedDecrement(&g_components);delete this;return 0;}return m_ref;}/**CAbstractUnknown::CAbstractUnknown(IUnknown* m_pUnknownouter){m_ref=1;InterlockedIncrement(&g_components);p_UnknownOuter=m_pUnknownouter;}HRESULT _stdcall CAbstractUnknown::NonDelegatingQueryInterface(const IID& riid,void** ppvObject){if(riid==IID_IUnknown){*ppvObject=static_cast<INonDelegatingUnknown*>(this);((IUnknown*)(*ppvObject))->AddRef();}return S_OK;}ULONG _stdcall CAbstractUnknown::NonDelegatingAddRef(){return InterlockedIncrement(&m_ref);}ULONG _stdcall CAbstractUnknown::NonDelegatingRelease(){if(InterlockedDecrement(&m_ref)==0){InterlockedDecrement(&g_components);delete this;return 0;}return m_ref;}*/?