template<class T,const IID* piid>
class IPtr
{
public:
IPtr(){m_pI=NULL;}
IPtr(T* lp)
{
m_pI=lp;
if(m_pI)
m_pI->AddRef();
}
IPtr(IUnknown* pI)
{
m_pI=NULL;
if(pI)
pI->QueryInterface(*piid,(void**)&m_pI);
}
~IPtr()
{
Release();
}
void Release()
{
if(m_pI)
{
m_pI->Release();
m_pI=NULL;
}
}
operator T*(){return m_pI;}
operator BOOL() const
{
return (m_pI!=NULL) ? TRUE:FALSE;
}
BOOL operator!(){return (m_pI==NULL)?TRUE:FALSE;}
T& operator*(){assert(m_pI!=NULL);return *m_pI;}
T** operator&(){assert(m_pI!=NULL);return &m_pI;}
T* operator->(){assert(m_pI!=NULL);return m_pI;}
const IID& iid(){return *piid;}
T* operator=(T* pI)
{
if(m_pI!=pI)
{
IUnknown* pOld=m_pI;
m_pI=pI;
if(m_pI!=NULL)
{
m_pI->AddRef();
}
if(pOld!=NULL)
{
pOld->Release();
}
}
return m_pI;
}
T* operator=(IUnknown* pI)
{
IUnknown* pOld=m_pI;
m_pI=NULL;
if(pI)
{
HRESULT hr=pI->QueryInterface(*piid,(void**)&m_pI);
assert(SUCCEEDED(hr) && (m_pI!=NULL));
}
if(pOld)
{
pOld->Release();
}
m_pI;
}
HRESULT CreateInstance(const CLSID& clsid,IUnknown* pI,DWORD clsctx)
{
Release();
return CoCreateInstance(clsid,pi,clsctx,*piid,(void**)&m_pI);
}
private:
T* m_pI;
};
void Fuzzy(IX* pIX1,IX* pIX2)
{
IPtr<IX,IID_IX> spIX;
spIX=pIX1;
spIX->Fx();
spIX=pIX2;
spIX->Fx();
}
void WasABear(IY* pIY)
{
IPtr<IX,IID_IX> spIX;
spIX=pIY;
if(spIX)
{
spIX->Fx();
}
}
int main()
{
IPtr<IX,&IID_IX> spIX;
HRESULT hr=spIX.CreateInstance(CLSID_Component1,NULL,CLSCTX_INPROC_SERVER);
spIX.Release();
}
智能指针类的实现
最新推荐文章于 2023-07-23 17:30:16 发布